【移动应用开发技术】框架如何创建App子类的对象(二)_第1页
【移动应用开发技术】框架如何创建App子类的对象(二)_第2页
【移动应用开发技术】框架如何创建App子类的对象(二)_第3页
【移动应用开发技术】框架如何创建App子类的对象(二)_第4页
【移动应用开发技术】框架如何创建App子类的对象(二)_第5页
免费预览已结束,剩余2页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】框架如何创建App子类的对象(二)

前言:谁来诞生子类的对象呢?答案是:框架。这样让框架能有绝对的制约能力去「框住」应用子类的结构和行为。接着,请你来思考一个有趣的问题:l框架开发者(强龙)先写框架基类的程序码;l然后,AP开发者(地头蛇)才撰写应用子类在后。那么框架开发者事先又如何知道地头蛇后来撰写的应用子类的名称呢?如果不知道应用子类的名称,又如何诞生应用子类的对象呢?ee

ee欢迎访问==>高老师的博客网页高焕堂:MISOO(大数据.大思考)联盟.台北中心和东京(日本)分社.总教练EE

EE框架如何创建App子类的对象(二)?由基类创建亲生子类的对象

1.

以MediaPlayer播放mp3音乐为例大家对于拿MediaPlayer来播放mp3音乐的应用程序,应该不会陌生。最简单的架构如下图所示:图1、由myActivity来创建MediaPlayer的对象你也可以设计一个包容器(Wrapper)类别来包装MediaPlayer类别,也就是由这个Wrapper来帮忙创建MediaPlayer对象,如下图所示:图2、由Wrapper协助来创建MediaPlayer的对象无论是在上图1或图2的架构里,你都是扮演一个传统的角色:AP开发者。于此,就来换个新鲜的角色:框架开发者。在上一篇文章里,已经说明了,必须让框架基类去创建应用子类的对象,才能让框架拥有高度的制约力量。在上一篇文章的范例里(即Ex04_01程序范例)已经实践了这个目标,让框架基类(如GraphView)来创建子类别(如myDrawing)的对象。其中,值得留意的是:上一篇文章范例里的基类GraphView并不是myDrawing的直系父类别(基类)。简而言之,myDrawing并不是继承GraphView基类。亦即,myDrawing并不是GraphView的亲生应用子类。

于是,在本文里,我们来看看一个基类如何创建亲生子类别的对象。如下图所示:图3、由基类Player来创建亲生子类mp3Player的对象

大家都知道一个类别本身就是一个对象,我们常常称之为「母对象」(Meta-object),而类别的静态函数(staticfunction)就是这个母对象的函数,在这种函数里可以(由该母对象)创建自己类别的对象。在上图的架构里,由myActivity创建Player基类的init()静态函数,这init()创建其亲生子类别mp3Player的对象。请留意,这init()会将mp3Player的IPlay接口传回给myActivity。一旦myActivity接到mp3Player的IPlay接口,就能进行实际的创建动作。也就是,myActivity透过IPlay接口,而创建到mp3Player的play()函数,并进而创建MediaPalyer的start()函数,展开了播放mp3音乐的动作了。[歡迎光臨高煥堂網頁:/myEIT/]2.

框架的设计与实践2.1复习:擅用配置文文件

在上一篇文章里,运用了配置(Configuration)文件的机制来实践由框架(的基类)来创建应用(AP或App)子类的对象的任务,这是框架开发的基本技巧。其主要面对的情境是:框架基类由强龙设计在先,而应用子类则由地头蛇开发在后。也就是说,当强龙撰写框架基类时,地头蛇(和客户)都尚未出现,基类开发者还不知道AP子类的名称,那么又如何去<<new>>一个AP子类的对象呢?其实很简单,因为在程序的执行时间(Run-time)才会真正创建对象,这执行时间已经是在地头蛇撰写子类的时间之后了,如下图所示:图4、由子类开发者撰写配置(Configuration)文件

因此,解决之道是:请地头蛇撰写完AP子类时,也将子类的名称字符串(classnamestring)写入一个特定的配置(Configuration)文件里,然后于程序执行时,才去读取配置文文件里的子类的名称字符串,然后透过Java的指令:Class.forName(classname).newInstance();就能创建该AP子类的对象了。于是,实践了由框架创建AP子类对象的任务了。2.2设计架构图基于上述配置文文件的机制,也依循上一篇文章范例的架构,兹绘制架构图如下:图6、由基类创建子类对象的过程创建完成子类对象之后,就能够透过接口来调用该子类对象的函数了。例如,myActivity就透过IPlay而调用mp3Player的play()函数,此刻myActivity就调用MediaPlayer的start()函数,开始播放了。如下图:图7、调用所创建的新对象结束播放时,myActivity就透过IPlay而调用了mp3Player的stop()函数,此刻myActivity就调用MediaPlayer的stop()函数了。2.3

撰写代码:<创建对象>的实践途径兹将上图落实为Android代码,其执行画面如下:首先建立一个Android的Ex04_02项目(Project),如下:背景图像sunrise.png存在/res里。撰写你的框架基类和API//Player.javapackagemyFramework;importandroid.content.Context;publicabstractclassPlayer{

staticprivatePlayerplayer=null;publicstaticIPlayinit(Contextcontext){

StringpkclassName=((PActivity)context).getPlayerClass();

try{

player=(Player)Class.forName(pkclassName).newInstance();

return(IPlay)player;

}catch(Exceptione)

{e.printStackTrace();

}

returnnull;

}}//PActivity.javapackagemyFramework;importcom.misoo.pk003.R;importandroid.app.Activity;publicabstractclassPActivityextendsActivity{

publicIPlayinit(){

returnPlayer.init(this);

}

publicStringgetPlayerClass(){

returnthis.getResources().getString(R.string.playerclass);

}}//

IPlay.javapackagemyFramework;importandroid.content.Context;publicinterfaceIPlay{

voidplay(Contextcontext);

voidstop();}把基类和API送人,协助别人去开发应用子类//mp3Player.javapackagecom.misoo.pk003;importmyFramework.IPlay;importmyFramework.Player;importandroid.content.Context;importandroid.media.MediaPlayer;importandroid.util.Log;publicclassmp3PlayerextendsPlayerimplementsIPlay{privateMediaPlayermPlayer=null;publicvoidplay(Contextcontext){

try{

mPlayer=MediaPlayer.create(context,R.raw.dreamed);

mPlayer.start();

}catch(Exceptione){

Log.e("StartPlay","error:"+e.getMessage(),e);

}

}publicvoidstop(){

if(mPlayer!=null){

mPlayer.stop();

mPlayer.release();

mPlayer=null;

}

}}//myActivity.javapackagecom.misoo.pk003;importmyFramework.IPlay;importmyFramework.PActivity;importandroid.os.Bundle;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.LinearLayout;publicclassmyActivityextendsPActivityimplementsOnClickListener{privateButtonibtn1,ibtn2;privateIPlayplayer;@OverrideprotectedvoidonCreate(Bundleicicle){

super.onCreate(icicle);

LinearLayoutlayout=newLinearLayout(this);

layout.setOrientation(LinearLayout.VERTICAL);

ibtn1=newButton(this);

ibtn1.setOnClickListener(this);

ibtn1.setText("Play");

ibtn1.setBackgroundResource(R.drawable.heart);

LinearLayout.LayoutParamsparam1=

newLinearLayout.LayoutParams(150,65);

param1.topMargin=10;

param1.leftMargin=10;

layout.addView(ibtn1,param1);

ibtn2=newButton(this);

ibtn2.setOnClickListener(this);

ibtn2.setText("Exit");

ibtn2.setBackgroundResource(R.drawable.mountain);

layout.addView(ibtn2,param1);

setContentView(layout);

//

player=init();

}publicvoidonClick(Viewv){

if(v==ibtn1){

setTitle("playing...");

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论