android监听程序被杀死,Android 监听主进程被杀

这篇博客介绍了如何在Android中通过Service监听并防止应用程序被杀死。当在多任务界面清除或结束进程时,Service能检测到并自动重启应用。关键在于启动Service的方式、设置单独进程以及监测主进程存活状态。然而,这种方法可能被视为恶意的保活手段,不建议滥用。测试范围覆盖了Android 5.1到7.1.1版本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当按多任务键时,然后清除所有程序或者杀死单个程序时,如果要监听这个动作的话,可以在一个service里监听。

效果如下:

可以看到,在多任务窗口中,左滑结束进程和清除所有进程后,都会自己再打开应用,代码如下:

public class KeepLifeService extends Service {

private static final String TAG="KeepLifeService";

private String mPackName;

private ActivityManager mActivityManager;

@Override

public void onCreate() {

super.onCreate();

mActivityManager =(ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);

String process=getProcessName();

mPackName =getPackageName();

boolean isRun=isRunningProcess(mActivityManager,mPackName);

Log.i(TAG, String.format("onCreate: %s %s pid=%d uid=%d isRun=%s", mPackName,process, Process.myPid(), Process.myUid(),isRun));

if(!isRun){

Intent intent = getPackageManager().getLaunchIntentForPackage(mPackName);

if(intent!=null){

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);

startActivity(intent);

}

}

}

@Nullable

@Override

public IBinder onBind(Intent intent) {

return null;

}

/**

* 获取当前进程名称

*

* @return

*/

public static String getProcessName() {

try {

File file = new File("/proc/" + android.os.Process.myPid() + "/" + "cmdline");

BufferedReader mBufferedReader = new BufferedReader(new FileReader(file));

String processName = mBufferedReader.readLine().trim();

mBufferedReader.close();

return processName;

} catch (Exception e) {

e.printStackTrace();

return null;

}

}

/**

* 进程是否存活

* @return

*/

public static boolean isRunningProcess(ActivityManager manager,String processName) {

if(manager==null)

return false;

Listrunnings = manager.getRunningAppProcesses();

if (runnings != null) {

for (ActivityManager.RunningAppProcessInfo info : runnings) {

if(TextUtils.equals(info.processName,processName)){

return true;

}

}

}

return false;

}

}

AndroidManifest.xml 文件中

启动service

startService(new Intent(this,KeepLifeService.class));

在主进程中启动service ,然后杀死主进程,这时service会自动重新启动,onCreate 会重走,pid会不一样,所以要监听主进程被杀,只需要在service 中的oncreate 判断主进程是否存活,不存活则为被杀,这时你可以重新启动应用或者别的。(这里为了演示,选择了重新启动应用,也算是保活手段,不过这种行为不好,别当流氓软件)

关键点:

其中启动service只能用startService ,不能用bindService,

mainifest 中service 要放单独进程,或者子进程。

如果想要保活的话?

这个只适用于 在多任务 页杀死进程,如果用

am force-stop packageName

杀进程的话,是不会重启service 的。

然后是应用自己崩溃,异常,这个可以用

Thread.setDefaultUncaughtExceptionHandler

监听,然后重启应用,但是如果是 so 包,也就是c 层崩溃,是监听不到异常的,这时可以用上面那个service 开线程,每30s 检查一次主进程是否存活,然后再启动之类。

本次测试Android 版本: 5.1~7.1.1,其它的自测,有效果的话可以评论留言。

Android中,监听应用或服务进程中发生死亡的情况通常是为了处理一些资源清理、数据保存或者通知管理。可以使用以下几种方式: 1. **BroadcastReceiver**:通过注册一个`BroadcastReceiver`并在其`onReceive()`方法中检查意图是否有表示进程结束的ACTION,如`ACTION.ProcessDeath`。当接收到这个广播,便可以得知进程已死。 ```java IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_PROCESS_DEATH); registerReceiver(myReceiver, filter); private BroadcastReceiver myReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_PROCESS_DEATH)) { // 进程死亡处理逻辑 } } }; ``` 2. **ServiceConnection**: 当在Service中启动了一个Activity或服务,并通过startForeground()方法使其保持可见,你可以创建一个`ServiceConnection`监听服务的状态变化。如果连接断开,这可能是进程关闭的一个信号。 ```java final ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder binder) { //... } @Override public void onServiceDisconnected(ComponentName name) { // 服务已断开连接,可能是进程结束 } }; startService(yourIntent); bindService(yourIntent, serviceConnection, Context.BIND_AUTO_CREATE); ``` 3. **JobScheduler** 或 `WorkManager`: 如果你需要定期执行任务并需要感知进程是否存活,可以使用这些工具来安排工作。虽然它们不是直接监听进程死亡,但可以在任务失败或周期性暂停时推断出进程可能已经关闭。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值