进程
应用场景
类似音乐类、跑步健身类、手机管家类等长时间需要在后台运行的应用Android中的进程
Android中的进程
前台 > 可见 > 服务 > 后台 > 空
Foreground process 前台进程(满足任一个条件)
1、拥有一个正在和用户交互的Activity(也就是说Activity 的onResume()方法被执行了)
2、拥有一个被用户的正在交互的Activity 绑定的Service
3、拥有一个以“前台模式”运行的Service–该Service 已经被调用了startForeground()方法
4、拥有一个正在执行生命周期方法的Service(onCreate()、onStart()、onDestory())
5、拥有一个BroadCastReceiver 并且正在执行onReceive()方法
Visible process 可视进程(满足任一条件)
可以看见,但不可以交互,*一个不拥有任何前台组件的进程,但是依然可以影响用户在屏幕上看见的控件。
1、拥有一个不是前台的Activity(onPause 方法被调用),但是对用户依然可见。这种情况(处于暂停状态的Activity)发生,比如,如果前台Activity 打开了一个dialog,该dialog 下面依然可见Activity。
2、拥有一个被可见或者前台Activity 绑定的Service
Service process 服务进程
后台进程
Activity完全处于后台所在的进程
Empty process 空进程
当程序退出时, 进程没有被销毁, 而是变成了空进程
跨进程访问四大组件
方法一:将被访问的组件封装成Component,然后通过Intent启动。通常应用于访问非系统应用的组件
被访问组件的exported属性设置为true
Intent intent = new Intent();
ComponentName componentName = new ComponentName("目标组件包名","目标组件名");
intent.setComponent(componentName);
startActivity(intent);
//ComponentName为一个特定的应用程序组件,Android四大组件均可用
方法二:指定目标组件中的Intent-filte中内容,如action,data等。常用语方位系统应用组件
//访问者
Intent intent = new Intent();
intent.setAction("com.demo.process.MYACTION"); //指定目标组件action
intent.setData(Uri.parse("message:")); //指定目标组件的data
intent.putExtra("key", "value"); //向目标组件传递信息
startActivity(intent);
//被访问组件
<activity android:name="com.demo.process.ShareActivity">
<intent-filter>
<action android:name="com.demo.interprocess.MYACTION"/>
<data android:scheme="message"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
进程保活
利用系统广播拉活
利用系统服务机制拉活。onStartCommand方法,返回START_STICKY
利用native进程拉活(5.0之后失效)
利用JobScheduler机制拉活
利用帐号同步机制拉活
杀死进程
通过PID
不能杀死其他进程
int pid = android.os.Process.myPid(); //获得自己的pid
android.os.Process.killProcess(pid); //通过pid自杀
退出JAVA虚拟机
System.exit(0);
通过包名,杀死其他进程
//添加权限
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
//通过包名,杀死指定进程
ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE); //获得获得管理器
am.killBackgroundProcesses(packageName);