как имитировать перезапуск приложения, не выходя из него - PullRequest
0 голосов
/ 29 января 2019

Путем «перезапуска» приложения я, по сути, пытаюсь сбросить все переменные экземпляра, поля, действия, службы и просто все приложение, как оно было при первом открытии.Единственное предостережение в том, что я не хочу на самом деле выходить из самого приложения.Есть ли способ, которым я бы достиг этого?

Ответы [ 2 ]

0 голосов
/ 29 января 2019

То, что я делал раньше на Android (iOS не позволяет перезапустить приложение), использует PendingIntent с кодом для очистки кэша приложения.Он по-прежнему выходит из приложения, но перезапускает его, как будто он только что из новой установки.

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());
    }
}

Далее приведен код для cleanCache ().

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();
}

Ниже приведен код дляExitActivity.

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());
    }
}
0 голосов
/ 29 января 2019

Там действительно нет быстрого и простого решения, чтобы сбросить все.

Основная причина в том, что нет способа узнать все, что вы хотите сбросить.Например, есть простой способ сбросить Activity, перезапустив Activity и очистив старую ... однако, это только сбрасывает Activity без статических переменных.Это также не касается Сервисов, Одиночных и других статических значений, которые вы изменили.

Единственное правильное и надежное решение - создать метод resetAll () самостоятельно.Пусть он отправит команды сброса каждой активной службе, вернет значения по умолчанию для текущей активности, обнулит синглтоны и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...