随着学习持续更新
四大组件均可使用 Android:process="name" 在 Manifest 中声明成独立进程
Activity
生命周期
4 种启动模式
Android 使用回退栈来管理 Activity 实例. 当前显示的 Activity 在栈顶, 当点击后退或返回时, 栈顶的 Activity 出栈.
可以指定 Activity 的启动模式来避免重复创建同一 Activity
在 AndroidManifest.xml 中声明 Activity 的启动模式
- <activity Android:name=".MyActivity"
- Android:lauchMode="singleTask"></activity>
- standard
默认的启动模式, 允许 Activity 被多次实例化, 一个任务栈中会有多个 Activity 实例
singleTop
处于栈顶的 Activity 会被重用, 若不在栈顶则会被重新创建. 重用时会调用原来实例的 onNewIntent()函数
singleTask(常用)
一个任务栈只允许存在一个 Activity 实例, 当 startActivity()时, 若该 Activity 在栈内, 则会将该 Activity 上的所有 Activity 销毁, 使该 Activity 处于栈顶, 并调用 onNewIntent()方法
singleInstance
一个 Activity 在独立的任务中开启, 保证在系统中只有一个实例, 所有的 startActivity()都会重用该实例, 并回调 onNewIntent()方法
两个 Activity 互相切换时的生命周期
A:onCreate->onStart->onResume
这是在 A 中启动 B 活动, 生命周期如下:
- A: onPause
- B: onCreate->onStart->onResume
- A: onStop
从 B 中返回 A 活动时
- B: onPause
- A: onRestart->onStart->onResume
- B: onStop->onDestroy
- Service
当程序进入后台运行时, 所需要做的操作可以通过 Service 实现.
在任何位置调用 startService()启动服务.
每个服务只存在一个实例, 每次调用 startService()时会回调 onStartCommand(); 只需要调用一次 stopService()或 stopSelf()函数, 服务会被停止.
普通 Service 运行在 UI 线程, 若需要执行耗时操作需要新开线程.
生命周期
- onCreate()
- onStartCommand(intent, flags, startId)
有三种返回值
START_STICKY: 当服务因内存不足被 kill 掉后, 内存空闲时会尝试重建服务, 重建成功则回调 onStartCommand(), 这是传入的 intent 为 null
START_NOT_STICKY: 当 Service 因内存不足而被系统 kill 后, 即使系统内存再次空闲时, 系统也不会尝试重新创建此 Service
START_REDELIVER_INTENT: 当 Service 因内存不足而被系统 kill 后, 则会重建服务, 并通过传递给服务的最后一个 Intent 调用 onStartCommand(), 这个值适用于主动执行应该立即恢复的作业 (例如下载文件) 的服务
onDestroy()
调用 stopService()或 stopSelf()
IntentService
重写 onHandleIntent()函数, 在函数中完成耗时操作. IntentService 会自动将操作执行在子线程中, 并在完成时调用 stopSelf()自我销毁
- public class MyIntentService extends IntentService {
- @Override
- protected void onHandleIntent(Intent intent) {
- ...
- }
- }
- Binder(与服务连接)
当服务仅限本地应用使用, 不需要跨进程工作, 则可以实现自有的 Binder 类, 让客户端通过该类直接访问服务中的公共方法.
首先需要创建 ServiceConnection 对象, 代表与服务的连接, 有两个方法
onServiceConnected(name, serivce)
系统会调用该方法传递服务的 onBind()方法返回的 IBinder, 通过该对象可以调用获取到 Service 的实例对象, 进而调用服务端的公共方法.
onServiceDisconnected(name)
系统与服务意外中断时调用, unBind 不会调用该方法
调用 bindService(intent, ServiceConnection, flag)绑定相关服务, flag 指绑定时是否自动创建 Service,0 表示不创建; BIND_AUTO_CREATE 表示自动创建.
调用 unbindService(ServiceConnection)
当最后一个客户端与服务取消绑定时, 系统会将服务销毁
前台服务
startForeground(int id, Notification notification)
将当前服务设成前台服务, id 参数为唯一标识通知的整型数, 不得为 0
stopForeground(boolean removeNotification)
Android8.0 后需要开启前台服务要在 Activity 中 startForegroundService(i), 且之后 Service 要在 5s 内调用 startForeground()才能成功创建前台服务
如何保证 Service 不被杀死
内存资源不足
将 onStartCommand()返回值设成 START_STICKY 或 START_REDELIVER_INTENT, 这样内存组后也会恢复服务
将服务设成前台服务, 具备较高优先级
用户手动干预
如果不是 force stop 则会调用生命周期中的 onDestroy()方法, 可以在方法中发送广播重启服务. 完备一些的话就启动两个服务, 相互监听, 相互重启.
- Broadcast
- https://www.jianshu.com/p/ca3d87a4cdf3
组成: 发送广播的 Broadcast, 接受广播的 BroadcastReceiver 和传递消息的 Intent.
类型: 普通广播, 有序广播, 本地广播(LocalBroadcast),Sticky 广播
静态广播与动态广播
广播可分为静态注册和动态注册两种形式
静态注册
在 Manifest.xml 中声明静态广播
- <receiver Android:name=".MyReceiver">
- <intent-filter Android:priority=1000>
- <action Android:name="com.broadcast"
- </intent-filter>
- </receiver>
动态注册
可以在 onCreate 的时候注册
- MyBroadcastReceiver receiver = new MyBroadcastReceiver();
- IntentFilter filter = new IntentFilter("my.action");
- context.registerReceiver(receiver, filter);
在 onDestroy 的时候注销
unregisterReceiver(receiver);
静态广播与动态广播的区别
静态广播在 activity 注销的时候也能够继续接收; 动态广播在 App 退出后就无法接收了
动态广播在相同 Priority 下优先级比静态广播高
普通广播
异步广播, 调用 sendBroadcast(new Intent(ACTION))来发出广播
定义广播接收器
- public class MyBroadcastReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- ...
- }
- }
在 AndroidManifest.xml 中注册:
- <receiver Android:name=".broadcast.MyBroadcastReceiver">
- <intent-filter>
- <action Android:name=".."/>
- </intent-filter>
- </receiver>
动态注册接收器:
registerReceiver(new MyBroadcastReceiver(), new IntentFilter(MY_ACTION));
有序广播
发送出去的广播被广播的接收者按照先后顺序接收
接收的顺序排序
按照 Priority 属性值从大到小
Priority 相同则动态注册广播优先
本地广播
只限于应用的广播
使用 LocalBroadcastManager.getInstance(context)来使用关于广播的操作函数:
- registerReceiver(receiver, intentFilter)
- unregisterReceiver(receiver)
- sendBroadcast(new Intent(INTENT_NAME))
- sendBroadcastSync(new Intent())
注册本地广播
- mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);
- mReceiver = new MyBroadcastReceiver();
- IntentFilter filter = new IntentFilter();
- filter.addAction(ACTION_MY_TYPE);
- mLocalBroadcastManager.registerReceiver(mReceiver,filter);
需要在 onDestory()的中进行注销:
- mLocalBroadcastManager.unregisterReceiver(mReceiver)
- ContentProvider
ContentProvider 可以将应用中的数据共享给其他应用访问, 其他应用可以通过 ContentProvider 对应用中的数据进行增删改查.
也可以进行进程间数据的交互和共享, 跨进程通信.
来源: https://www.cnblogs.com/y4ngyy/p/12496745.html