如何模仿重新启动应用程序而不实际退出应用程序

时间:2019-01-29 01:51:48

标签: java android android-studio

通过“重新启动”应用程序,我本质上想做的就是将所有实例变量,字段,活动,服务以及所有的应用程序重置为首次打开时的状态。唯一需要注意的是,我不想退出应用程序本身。我有什么办法可以做到这一点?

2 个答案:

答案 0 :(得分:0)

确实没有快速简便的解决方案来重置所有内容。

主要原因是因为无法知道要重置的所有内容。例如,有一种简单的方法可以通过重新启动活动并清除旧的活动来重置活动...但是,这只会重置活动减去静态变量。它也不会涉及您已更改的服务,单例和其他静态值。

只有正确而可靠的解决方案是自己创建一个resetAll()方法。使其将重置命令发送给每个活动的Service,将当前Activity的默认值改回默认值,使Singleton无效,等等。

答案 1 :(得分:0)

我之前在android上做过的事情(iOS不允许重新启动应用程序)是使用## pad newd with an arbitrary value for variable c2 newd$c2 <- "a" ## termwise prediction pt <- predict.gam(mod, newd, type = "terms", exclude = "s(c2)") ## linear predictor without random effect lp_no_c2 <- rowSums(pt) + attr(pt, "constant") 及其代码来清除应用程序的缓存。它仍然会退出该应用程序,但会像从全新安装一样重新启动它。

PendingIntent

然后下面是cleanCache()的代码。

cleanCache();

PackageManager pm = context.getPackageManager();
if(pm != null){
    Intent activity = pm.getLaunchIntentForPackage(getBaseContext().getPackageName());
    if(activity != null){
        activity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        int pendingIntentId = 223344;
        PendingIntent pendingIntent = PendingIntent.getActivity(context, pendingIntentId, activity, PendingIntent.FLAG_CANCEL_CURRENT);
        AlarmManager mgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 5, pendingIntent);
        System.exit(0);
    }else{
        Log.d(TAG, "was not able to restart, activity null");
    }
}else{
    Log.d(TAG, "was not able to restart, pm null");
}

public class ExitActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_exit);

        android.os.Process.killProcess(android.os.Process.myPid());
    }
}

然后下面是ExitActivity的代码。

private void cleanCache() {
    clearApplicationData();

    Intent intent = new Intent(context, ExitActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK  |
            Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_NO_ANIMATION);
    context.startActivity(intent);
} 

public void clearApplicationData(){
    File cache = context.getCacheDir();
    File appDir = new File(cache.getParent());

    context.deleteDatabase("webview.db");
    context.deleteDatabase("webviewCache.db");
    webMain.clearCache(true);

    if (appDir.exists()) {
        String[] children = appDir.list();
        for (String s : children) {
            if (!s.equals("lib")) {
                deleteDir(new File(appDir, s));Log.i("TAG", "**************** File /data/data/APP_PACKAGE/" + s + " DELETED *******************");
            }
        }
    }

}

public static boolean deleteDir(File dir){
    if (dir != null && dir.isDirectory()) {
        String[] children = dir.list();
        for (int i = 0; i < children.length; i++) {
            boolean success = deleteDir(new File(dir, children[i]));
            if (!success) {
                return false;
            }
        }
    }
    return dir.delete();
}