创建APIDEMOS项目" />
当前位置: 代码迷 >> Android >> 4.3.创建APIDEMOS项目
  详细解决方案

4.3.创建APIDEMOS项目

热度:420   发布时间:2016-04-28 07:53:43.0
android Activity和service深入介绍

目录

4.1.Activity的生命周期 2

4.1.1.Activity的状态 3

4.1.1.2.状态的种类 3

4.1.1.3.相关方法 3

4.1.2.生命周期 3

4.1.2.1.获取Acivity生命周期图 3

4.1.2.2由创建至运行状态 5

4.1.2.3.由运行状态转为暂停状态,再转换为运行状态 6

4.1.2.4.由运行状态转为停止状态 6

4.1.1.5.运行状态的Activity被关闭掉 6

4.1.2.6.暂停或停止状态的Activity被系统回收 6

4.1.3.startActivity()返回与finish()返回的区别 6

4.1.3.1.startActivity()方式返回 6

4.1.3.2.finish()方式返回: 7

4.2.Service 7

4.2.1.概述 7

4.2.2. 启动Service 7

4.2.3.Service的生命周期 7

4.2.3.1.获取Service生命周期图 7

4.2.3.2.startService()启动服务的执行流程 9

4.2.3.3.bindService()绑定的执行流程 9

4.2.4.相关的方法 9

4.2.5.Service的创建与绑定原理 10

4.2.6. bindServicestartService对比 12

4.3.创建APIDEMOS项目 12

 

4.1.Activity的生命周期

4.1.1.Activity的状态

Activity处于不同的状态,Activity的生命周期就处于不同的状态

4.1.1.2.状态的种类

运行态:Activity正常运行的时候

暂停态:锁屏前或者Activity被其它Activity部分遮挡时处于暂停状态

停止态:被其他Activity完全遮挡时,Activity处于停止状态。

4.1.1.3.相关方法

Android提供了以下方法用于Activity在不同状态时触发:

OnCreate:Activity被Android系统实例化之后触发。

onDestory:Activity被系统回收时触发。

onStart:onCreate或onRestart方法之后触发。

onStop:Activity处于停止状态时触发。

onPause:Activity处于暂停状态时触发,建议:必要的数据在onPause中保存。

onResume:onStart方法之后触发。

onRestart:Activity由停止状态转变为运行状态时触发。

4.1.2.生命周期

4.1.2.1.获取Acivity生命周期图

按以下步骤获得Acivity生命周期图

步骤1、按图-1所示操作:

图-1

步骤2、按图-2所示操作:

图-2

步骤3、在图-2中将页面向下移动至看见如图-3所示的Activity的生命周期图,右击鼠标,在弹出菜单中选择“另存为图片”可将网页中该图保存至硬盘等存储设备中。

图-3

4.1.2.2由创建至运行状态

执行流程如图-3中标注(1)所示:onCreate()->onStart()->onResume()

1Activity被启动,系统自动实例化Activity

提示:Activity实例化的代码不需要开发者编写,由Android系统自动完成。

2、系统执行onCreate方法,在这里初始化Activity. 通常可以调用setContentView()方法设置布局界面, 使用findViewById() 获得控件,并定义事件响应程序。

3onStart()方法被触发。

4onResume()方法被触发。

5Activity处于运行状态,

4.1.2.3.由运行状态转为暂停状态,再转换为运行状态

执行流程如图-3中标注(2)所示:onResume()->onPause()->onResume()

1、当锁屏前或者Activity被其它Activity部分遮挡时处于暂停状态

2onPause()方法被触发。

3、用户按电源按钮,点亮屏幕,或本Activity重新处于屏幕最上面,onResume()方法被触发。

4.1.2.4.由运行状态转为停止状态

执行流程如图-3中标注(3)所示:

onResume()->onPause()->onStop()->onRestart()->onStart()->onResume()

Activity被其它Activity完全遮挡时,Activity处于停止状态

1onPause()方法被触发。

2onStop()方法被触发。

3、新的Activity处于屏幕最上面。

4、当本Activity重新处于屏幕最上面时,onRestart()方法被触发。

5onStart()方法被触发。

6onResume()方法被触发。

4.1.2.5.运行状态的Activity被关闭掉

执行流程如图-3中标注(3)所示:onResume()->onPause()->onStop()->onDestroy()

单击Back按钮或代码中调用了finish()方法, 

1onPause()方法被触发。

2onStop()方法被触发。

3onDestroy()方法被触发。

4.1.2.6.暂停或停止状态的Activity被系统回收

执行流程如图-3中标注(3)所示:

处于暂停或停止状态的Activity,在系统内存匮乏时,整个进程会被系统回收,在必要时,允许重新激活。

4.1.3.startActivity()返回与finish()返回的区别

4.1.3.1.startActivity()方式返回

ActvityA调用startActivity()方法启动AcivityB,在ActivityB中调用startActivity()方法启动AcivityA,此时将创建新的ActivityA对象,而不是原来的Activity对象。

4.1.3.2.finish()方式返回:

采用finish()方法返回到Activity的做法,将回到之前的Activity A,并不会新建一个Activity A的对象。

4.2.Service

4.2.1.概述

1ServiceAndroid四大组件之一(另外三个分别是:ActivityBroadcastContent Provider)。

2Service本质上是后台运行的可执行程序,它没有Activity那样的用户界面。

3Service不能与用户进行交互,不能自己启动、运行在后台,类似于线程的程序。

3Android提供了大量的系统的ServiceService可自定义。

4.2.2. 启动Service 

1、通过Context.startService()方法启动一个指定的Service

2、通过Context.bindService()方法将一个指定的Service与当前的组件(例如一个Activity)绑定。

提示:

ContextActivityService类的间接父类。

bindService()方法在绑定时,可以设置启动并绑定,或只绑定不启动(当Service已经被启动时)。

4.2.3.Service的生命周期

4.2.3.1.获取Service生命周期图

步骤1与获取Activity生命周期图相同。

步骤2、按图-4所示操作。

图-4

步骤3、在图-4的页面中下向找到图-5所示的Sevice生命周期图:

图-5

4.2.3.2.startService()启动服务的执行流程

执行流程如图-5中的Unbounded(非绑定方式)

1、 其它组件(例如Activity)调用startServie()方法;

2、 onCreate()方法被触发,执行初始化操作;

3、 onStartCommand()方法被触发。

4、 当执行了stopService()方法后,将结束Service对象,同时onDestroy()方法被触发。

4.2.3.3.bindService()绑定的执行流程

执行流程如图-5中的bounded(绑定方式)

onCreate()->onBind()->onUnbind()->onDestroy()

1onCreate()方法被触发;

2onBind()方法被触发,并返回一个IBinder的实现类的对象,该对象将在与service绑定的组件中被获得。

3onUnbind()方法在unbindService()方法执行后(解除绑定)触发。

4onDestroy()方法在Service 被关闭时触发。

4.2.3.4.再绑定的执行流程

Service绑定后,可以解除绑定,然后再次绑定。但前提是首次绑定时,该Service已存在,即:只有在单纯绑定(绑定但不启动Service)的情况下,解除绑定,才能再次绑定。若是绑定的同时启动Service,则解除绑定时,该Service将被关闭。

执行流程:onBind()->onUnbind->onRebind()

提示:若要再次绑定,则必须onUnbind()方法的返回值是true,否则,无法再次绑定服务。

4.2.4.相关的方法

1startService(Intent);

作用:启动intent对象中指定的目标Service

示例代码:

Intent intent=new Intent(起始组件对象,目标Service.class);

startService(intent);

提示:启动后的Service将在后台运行,具有自己的生命周期与当前组件不再有直接的关联。

2bindService(Intent intent, ServiceConnection conn,int flags);

作用:与intent指定的目标Service绑定。

参数-intent:启动intent对象中指定的目标Service

参数-conn:是一个实现了ServiceConnection接口的对象,该对象用于监听访问者与Service之间的连接情况。当绑定成功时,将调用ServiceConnection对象的onServiceConnected方法。当解除绑定时将调用onServiceDisconnected方法。

参数flags:指定绑定时是否自动创建Service。值为0时不自动创建Service,当值是BIND_AUTO_CREATE常量时,自动创建Service

3ServiceConnection接口

作用:用于监听访问者与Service之间的连接情况,该接口定义了两个方法:

(1) onServiceConnected(ComponentName name, IBinder service)

作用:绑定成功时触发本方法。

参数-name:被绑定的Service的一个实例。

参数-service:通过被绑定的Service类中的onBind方法返回一个IBind类型的对象。通过该对象可获得service中的数据。

2onServiceDisconnected(ComponentName name);

作用:解除绑定时触发本方法。

示例代码:

//创建服务连接对象conn,实现ServiceConnection接口中的两个方法

private ServiceConnection conn = new ServiceConnection() {

/*重写onServiceConnected方法,当前AcivityService绑定成功,

 * 则执行本方法,其中:

 * 第一个参数:被绑定的服务对象

 * 第二个参数:InfoBind的一个对象,由方法返回该对象->以下方法的第二个参数

   service

 * public IBinder onBind(Intent intent) {

  return new infoBind();

}

 */

public void onServiceConnected(ComponentName name, 

IBinder service) {

//在本方法编写绑定成功时的相关编写代

MyService.InfoBind infoBind;

infoBind=(MyService.InfoBind)service;

}

//断开绑定时调用本方法。

public void onServiceDisconnected(ComponentName name) {

}

图-6

4.2.5.Service的创建与绑定原理

1. 创建一个继承Service的类MyService,以下代码是一个自定义的Service类的结构:

//MyService类继承自Service

public class MyService extends Service {

private String tag="MyService";//日志窗口中的过滤条件标志

/*必须重写的方法,该方法用于返回被绑定的IBinder类的一个实例,本例中因不涉及

  绑定服务,所以返回null*/

@Override

public IBinder onBind(Intent intent) {

return null;

}

@Override

public void onCreate() { //Service类创建时触发本方法

super.onCreate();

Log.i(tag,"service onCreate");//在日志窗口中显示本方法已执行

}

//Service类的实例被启动触发本方法

@Override

public void onStart(Intent intent, int startId) {

super.onStart(intent, startId);

Log.i(tag,"service onStart");//在日志窗口中显示本方法已执行

}

//Service的一个实例被收回时,执行的方法

@Override

public void onDestroy() {

super.onDestroy();

Log.i(tag,"service-onDestroy");//在日志窗口中显示本方法已被回收

}

}

图-7

说明:

以上示例是调用startService()方法启动Service。由于不涉及启动方与Service对象的绑定,因此onBind()方法中返回的值为null

以下代码展示绑定的Service的类结构:

public class MyService extends Service {

private int current;//MyService的一个属性

//日志窗口中过滤标签,值为当前类的类名

private final static String tag="MyService";

/*自定义Service类的一个内部类InfoBind类,该类只有一个功能,

 *返回MyService.current属性的值->与其绑定的Activity*/

public class InfoBind extends Binder{

public int getCurrent(){

return current;

}

}

/*必须重写的方法,该方法负责将自定义的InfoBind的一个对象返回给

  与其绑定的组中的ServiceConnection类中的

onServiceConnected方法的第个参数service */

@Override

public IBinder onBind(Intent intent) {

return new infoBind();

}

//其他方法省略

}

图-8

说明:

以上代码中的InfoBindMyService的一个内部类,该类只是示范,类名不一定非是InfoBind,该类是Binder类的子类。而Binder类实现了IBinder接口。因此在onBinder方法中可以返回InfoBind对象。

当然,可以在onBinder方法的return命令后面直接写new IBinder(),即返回IBinder接口的一个实现类的对象。但要实现该接口所有声明的方法。

Android框架提供了Binder类,该类实现了IBinder接口中的方法,由于这些方法是被系统调用,应用开发时无需调用。因此,以上的InfoBinder类通过继承Binder,间接实现了IBinder接口,则onBind方法允许返回InforBind对象。

实际开发中通常采用以上方式返回一个对象。该对象中可以自定义与业务需求相关的方法,这些方法可以返回当前Service中的一些数据(如图-7中的MyService.current属性值)。

OnBind()方法返回的对象将在图-6的第二个红框中的onServiceConnected方法的第二个参数service获得,即service中存放了onBind()返回的对象的地址。

-7中第一个红框中的注释语句也说明了service获得的是MyService.onBind()方法返回的的对象。

图-9MyService与其绑定的Activity之间传递对象地址的示意图:

图-9

2. 在项目清单中注册Service

示例代码如下:

<service android:name=".MyService"></service>

4.2.6. bindServicestartService对比

1、通过多次调用startService,每次都触发Service类中的onStart()方法,并用Intent对象向Service传递不同的数据,从而达到控制Service。但这种方法不太方便。

2、通过绑定的方式,使用onBind传给ServiceConnectionIBinder控制Service,这种方式比较便捷,实际开发中推荐使用这种方式。

4.3.创建APIDEMOS项目

Android提供了许多范例代码,通过对这些范例的学习可达到快速掌握Android相关技术的目的。以下介绍创建API  DEMOS项目的方法。

按下图所示创建带APIDEMOS源代码的项目

-10

提示:因项目比较大,所以编译时间比较长。

模拟器中已经安装了APIDEMO,但没有源代码。运行模拟器中的APIDEMOS的步骤:

步骤1、按图-11所示操作:

图-11

步骤2、按图-12操作

图-12

  相关解决方案