目录
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. bindService与startService对比 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()
1、Activity被启动,系统自动实例化Activity
提示:Activity实例化的代码不需要开发者编写,由Android系统自动完成。
2、系统执行onCreate方法,在这里初始化Activity. 通常可以调用setContentView()方法设置布局界面, 使用findViewById() 获得控件,并定义事件响应程序。
3、onStart()方法被触发。
4、onResume()方法被触发。
5、Activity处于运行状态,
4.1.2.3.由运行状态转为暂停状态,再转换为运行状态
执行流程如图-3中标注(2)所示:onResume()->onPause()->onResume()
1、当锁屏前或者Activity被其它Activity部分遮挡时处于暂停状态
2、onPause()方法被触发。
3、用户按电源按钮,点亮屏幕,或本Activity重新处于屏幕最上面,onResume()方法被触发。
4.1.2.4.由运行状态转为停止状态
执行流程如图-3中标注(3)所示:
onResume()->onPause()->onStop()->onRestart()->onStart()->onResume()
当Activity被其它Activity完全遮挡时,Activity处于停止状态
1、onPause()方法被触发。
2、onStop()方法被触发。
3、新的Activity处于屏幕最上面。
4、当本Activity重新处于屏幕最上面时,onRestart()方法被触发。
5、onStart()方法被触发。
6、onResume()方法被触发。
4.1.2.5.运行状态的Activity被关闭掉
执行流程如图-3中标注(3)所示:onResume()->onPause()->onStop()->onDestroy()
单击Back按钮或代码中调用了finish()方法,
1、onPause()方法被触发。
2、onStop()方法被触发。
3、onDestroy()方法被触发。
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.概述
1、Service是Android四大组件之一(另外三个分别是:Activity、Broadcast和Content Provider)。
2、Service本质上是后台运行的可执行程序,它没有Activity那样的用户界面。
3、Service不能与用户进行交互,不能自己启动、运行在后台,类似于线程的程序。
3、Android提供了大量的系统的Service,Service可自定义。
4.2.2. 启动Service
1、通过Context.startService()方法启动一个指定的Service。
2、通过Context.bindService()方法将一个指定的Service与当前的组件(例如一个Activity)绑定。
提示:
Context是Activity、Service类的间接父类。
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()
1、onCreate()方法被触发;
2、onBind()方法被触发,并返回一个IBinder的实现类的对象,该对象将在与service绑定的组件中被获得。
3、onUnbind()方法在unbindService()方法执行后(解除绑定)触发。
4、onDestroy()方法在Service 被关闭时触发。
4.2.3.4.再绑定的执行流程
Service绑定后,可以解除绑定,然后再次绑定。但前提是首次绑定时,该Service已存在,即:只有在单纯绑定(绑定但不启动Service)的情况下,解除绑定,才能再次绑定。若是绑定的同时启动Service,则解除绑定时,该Service将被关闭。
执行流程:onBind()->onUnbind->onRebind()
提示:若要再次绑定,则必须onUnbind()方法的返回值是true,否则,无法再次绑定服务。
4.2.4.相关的方法
1、startService(Intent);
作用:启动intent对象中指定的目标Service。
示例代码:
Intent intent=new Intent(起始组件对象,目标Service.class);
startService(intent);
提示:启动后的Service将在后台运行,具有自己的生命周期与当前组件不再有直接的关联。
2、bindService(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。
3、ServiceConnection接口
作用:用于监听访问者与Service之间的连接情况,该接口定义了两个方法:
(1) onServiceConnected(ComponentName name, IBinder service)
作用:绑定成功时触发本方法。
参数-name:被绑定的Service的一个实例。
参数-service:通过被绑定的Service类中的onBind方法返回一个IBind类型的对象。通过该对象可获得service中的数据。
(2)onServiceDisconnected(ComponentName name);
作用:解除绑定时触发本方法。
示例代码:
//创建服务连接对象conn,实现ServiceConnection接口中的两个方法
private ServiceConnection conn = new ServiceConnection() {
/*重写onServiceConnected方法,当前Acivity与Service绑定成功,
* 则执行本方法,其中:
* 第一个参数:被绑定的服务对象
* 第二个参数: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
说明:
以上代码中的InfoBind是MyService的一个内部类,该类只是示范,类名不一定非是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()方法返回的的对象。
图-9是MyService与其绑定的Activity之间传递对象地址的示意图:
图-9
2. 在项目清单中注册Service
示例代码如下:
<service android:name=".MyService"></service>
4.2.6. bindService与startService对比
1、通过多次调用startService,每次都触发Service类中的onStart()方法,并用Intent对象向Service传递不同的数据,从而达到控制Service。但这种方法不太方便。
2、通过绑定的方式,使用onBind传给ServiceConnection的IBinder控制Service,这种方式比较便捷,实际开发中推荐使用这种方式。
4.3.创建APIDEMOS项目
Android提供了许多范例代码,通过对这些范例的学习可达到快速掌握Android相关技术的目的。以下介绍创建API DEMOS项目的方法。
按下图所示创建带APIDEMOS源代码的项目
图-10
提示:因项目比较大,所以编译时间比较长。
模拟器中已经安装了APIDEMO,但没有源代码。运行模拟器中的APIDEMOS的步骤:
步骤1、按图-11所示操作:
图-11
步骤2、按图-12操作
图-12