一、activity启动模式标准
概念:进程、线程、应用程序、任务栈、启动模式
1)任务栈
记录当前用户操作的行为的一种数据结构,(后进先出的数据结构)
注意:***一个应用程序默认是一个应用栈,特俗情况:在singleinstance会有多个任务栈***
2)进程
Android系统,应用程序退出和进程退出是两个不同的概念
Android系统为了让应用程序可以被快速的开启,所有的应用程序退出后,进程是不会退出的,只有当系统的内存空间严重不足的时候才会把进程回收
点击图标 ---->Linux创建进程 ---->dalvik虚拟机 ---->读取清单文件,加载activity
3)线程
进程是操作系统分配内存控件的单位,每个进程的内存空间都是独立的,线程是运行在进程里面的,线程是cpu执行的最小单位,进程销毁线程也就没了
4)应用程序
Android应用程序:每个应用程序都是运行在sandbox(沙箱)由进程管理,可以理解为组件activity、service、content provider、broadcastreceiver的组合
5)启动模式(launchMode)
1.standard 标准的启动模式
一个activity默认就是标准的启动模式,开启新的activity,activity就会被创建出来加入到任务栈的栈顶,适用于绝大多数的应用场景
2.singleTop启动模式
单一顶部启动模式,如果发现一个activity启动过并且在任务栈的栈顶,就不会被再次重新创建。主要是解决用户体验,避免重复打开已经打开的界面
在同一个任务栈里可以有多个实例存在
3.singleTask 单一任务栈启动模式
开启新的activity回去检查是否有activity的实例存在,如果存在就直接清空这个实例上面的所有activity,服用这个已经存在的实例
在同一个任务栈里面只有一个实例存在
singleinstance 单一实例
类似与Java中的单例模式、单态模式。在整个Android手机操作系统里面只有一个activity的实例存在
singleinstance 启动模式的activity运行在自 **单独** 的任务栈里面
应用场景:如果希望一个activity,在整个手机操作系统只有一个实例存在,通话的时候就是采用这个,只允许一个电话接入
*任务栈的id为int类型的整数,自增长的id*
二、广播接收者BroadcastReceiver
例如电池电量不足、手机开机成功都会广播一条消息
1)使用内置的广播接收者
1.创建一个类继承broadcastreceiver
2.配置广播接收者
<receiver android:name="com.example.broadcastreceiver.IpBroadcastReceiver" >
<intent-filter>
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
</receiver>
3.特殊的广播接收者需要添加权限
2)如何自定义对外发送接收广播消息
1.建立广播发送者:
1. 创建意图intent
2. 设置广播动作
3. 设置发送数据
4. 发送广播
public void click(View v){
Intent intent = new Intent();
intent.setAction("com.example.broadcastsender.haha");
intent.putExtra("data", "123456789+");
sendBroadcast(intent);
}
2.建立广播接收者
1. 在接收的Android工程里面创建接收类继承BroadcastReceiver实现onReceive方法
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String data = intent.getStringExtra("data");
System.out.println("接收到的数据为:"+data);
}
}
- 在清单配置文件里面配置好接收者
<receiver android:name="com.example.broadcastreceiver.MyReceiver">
<intent-filter >
<action android:name="com.example.broadcastsender.haha"/>
</intent-filter>
</receiver>
- 通过intent.getStringExtra(“data”);获取发送者发送的数据
3)广播事件类型
1. 无序广播
广播发送的时候,接收者接收没有先后顺序
2.有序广播
广播发送接,接收者按照优先级,先后顺序接收的,优先级priority从1000到-1000,数字越大优先级越高,0是默认的优先级
4)屏幕锁屏和解锁的广播接收者
这是一组特殊的广播事件,接收这些事件采用清党文件mainifest.xml配置不生效,要用代码的方式注册才会生效
如果这个广播事件经常发生,一般不允许采用清单注册,采用代码在oncreate()注册,好处就是程序运行生效,程序不运行失效,省电
需求:希望片面锁屏解锁的广播接收长期生效,即使应用程序退出也能接收到广播消息
这就得把广播方法服务里面了