最近做个项目,需要让程序退出后,再次启动程序,哪位大佬可以指点一下,
这块需要用到NDK双进程守护,用c语言fork一个服务进程,当apk退出时,守护服务进程再次拉起apk,具体实现操作建议查看腾讯课堂-动脑学院-NDK双进程守护那个免费视频,你就会得到想要的结果,希望给个分
建议写一个服务,服务可以做到重启,然后用服务唤醒程序。
使用android.os.Process.killProcess(android.os.Process.myPid());退出应用,但存在Activity没有调用finish方法。AMS会重新开启一个线程来从onCreate新建该Activity
使用kill process退出应用时,记得在Activity之间跳转时(即startActivity后,调用finish方法)。
在ActivityLifecycleCallbacks的onActivityPaused中操作退出程序,思路在这了,具体怎么实现我就不说了,网上一大推ActivityLifecycleCallback的用法
new Thread() {
@Override
public void run() {
Intent intent = new Intent(mContext, MainActivity.class);
PendingIntent restartIntent = PendingIntent.getActivity(mContext, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);
AlarmManager mgr = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, restartIntent);
android.os.Process.killProcess(android.os.Process.myPid());
}
}.start();
或者
public void restartApp(){
Intent intent = new Intent(instance,MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
instance.startActivity(intent);
android.os.Process.killProcess(android.os.Process.myPid()); //结束进程之前可以把你程序的注销或者退出代码放在这段代码之前
}
调用finish方法
使用android.os.Process.killProcess(android.os.Process.myPid());退出应用,AMS会重新开启一个线程来从onCreate新建该Activity使用kill process退出应用时,记得在Activity之间跳转时(即startActivity后,调用finish方法)。
使用系统事件去实现,比如注册接收一个自动更新的广播
public class UpdateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
if (intent.getAction().equals("android.intent.action.PACKAGE_REPLACED")) {
Toast.makeText(context, "版本更新完成,重新启动此程序", Toast.LENGTH_SHORT).show();
Intent intent2 = new Intent(context, MainActivity.class);
intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent2);
//接收安装广播
if (intent.getAction().equals("android.intent.action.PACKAGE_ADDED")) {
String packageName = intent.getDataString();
Log.i(this.getClass().getName(), "DownLoadApk:安装了:" + packageName + "包名的程序");
}
//接收卸载广播
if (intent.getAction().equals("android.intent.action.PACKAGE_REMOVED")) {
String packageName = intent.getDataString();
Log.i(this.getClass().getName(), "DownLoadApk:卸载了:" + packageName + "包名的程序");
}
}
}
}
要实现杀不死的进程需要通过jni进行双进程守护
需要一个守护进程,简单的实现方式,可以两个进度时刻发心跳,如果其中一个进度被关闭,可以通过守护进程重新启动程序。
调用相应的函数接口,创建父子进程,父进程监视程序是否退出,子进程重新拉起程序。