一、Activity的四种启动模式详解
-
标准模式(standard)
-
栈顶复用模式(singleTop)
如果新启动的activity位于任务栈顶,则不会被重新创建,只会重新调用 onPause、onNewIntent、onResume方法,也就是说会重新走一遍前台的生命周期;
-
栈内复用模式(singleTask)
只存在唯一的实例,将该Activity实例之上的Activity被出栈,一般项目的MainActivity都设置为此模式,方便放回首页和清空中间Activity;
-
单例模式(singleInstance)
除了具有singleTask模式的所有特性外,还加强了一点,该Activity只能单独地位于一个任务栈中。
-
标记属性
属性 | 含义 |
---|---|
FLAG_ACTIVITY_SINGLE_TOP | 指定启动模式为栈顶复用模式(SingleTop) |
FLAG_ACTIVITY_NEW_TASK | 指定启动模式为栈内复用模式(SingleTask) |
FLAG_ACTIVITY_CLEAR_TOP | 所有位于其上层的Activity都要移除,SingleTask模式默认具有此标记效果 |
二、android开发中跨进程通信有几种方式
-
在android SDK中提供了4种用于跨进程通讯的方式,Activity、Content Provider、Broadcast和Service。
1、 Activity可以跨进程调用其他应用程序;
2、Content Provider可以跨进程访问其他应用程序中的数据(以Cursor对象形式返回),当然,也可以对其他应用程序的数据进行增、删、改操 作;
3、 Broadcast可以向android系统中所有应用程序发送广播,而需要跨进程通讯的应用程序可以监听这些广播;
4、Service和Content Provider类似,也可以访问其他应用程序中的数据,但不同的是,Content Provider返回的是Cursor对象,而Service返回的是Java对象,这种可以跨进程通讯的服务叫AIDL服务。
三、Service相关
-
Service两种启动方式 startService、 bindService 区别及生命周期
- startService: onCreate -> onStartCommand -> onDestory ,在多次调用startService的时候,onCreate不重复执行,但是onStartCommand会执行。startService调用了这后,会一直存在,直到其调用了stopService。
- bindService : onCreate -> onBind -> onUnbind -> onDestory,多次调用bindService,onCreate及onBind都只执行一次。它生命周期跟随其调用者,调用者释放的时候,必须对该Service解绑,当所有绑定全部取消后,系统即会销毁该服务。 bindService 的方式通过onServiceConnected方法,获取到Service对象,通过该对象可以直接操作到Service内部的方法,从而实现的Service 与调用者之间的交互。
-
Service绑定服务的三种实现方式,扩展Binder类、使用Messenger、使用AIDL
服务Service与线程Thread的区别
1,两者概念的迥异
【1】Thread 是程序执行的最小单元,它是分配CPU的基本单位,android系统中UI线程也是线程的一种,当然Thread还可以用于执行一些耗时异步的操作。
【2】Service是Android的一种机制,服务是运行在主线程上的,它是由系统进程托管。它与其他组件之间的通信类似于client和server,是一种轻量级的IPC通信,这种通信的载体是binder,它是在linux层交换信息的一种IPC,而所谓的Service后台任务只不过是指没有UI的组件罢了。
2,两者的执行任务迥异
【1】在android系统中,线程一般指的是工作线程(即后台线程),而主线程是一种特殊的工作线程,它负责将事件分派给相应的用户界面小工具,如绘图事件及事件响应,因此为了保证应用 UI 的响应能力主线程上不可执行耗时操作。如果执行的操作不能很快完成,则应确保它们在单独的工作线程执行。
【2】Service 则是android系统中的组件,一般情况下它运行于主线程中,因此在Service中是不可以执行耗时操作的,否则系统会报ANR异常,之所以称Service为后台服务,大部分原因是它本身没有UI,用户无法感知(当然也可以利用某些手段让用户知道),但如果需要让Service执行耗时任务,可在Service中开启单独线程去执行。
3,两者使用场景
【1】当要执行耗时的网络或者数据库查询以及其他阻塞UI线程或密集使用CPU的任务时,都应该使用工作线程(Thread),这样才能保证UI线程不被占用而影响用户体验。
【2】在应用程序中,如果需要长时间的在后台运行,而且不需要交互的情况下,使用服务。比如播放音乐,通过Service+Notification方式在后台执行同时在通知栏显示着。
网友评论