Как убить и очистить приложение в фоне?

Такая ситуация, если приложение находиться некоторое время в фоне, когда снова открываешь, ошибка.
Для этого реализовал следующее:

Class Service :

    public class ExitAppService extends JobIntentService {

    final Handler mHandler = new Handler();
    private static final String TAG = "MyJobIntentService";


    public static void enqueueWork(Context context, Intent intent) {
        enqueueWork(context, ExitAppService.class, JOB_ID, intent);
    }

    @Override
    public void onCreate() {
        super.onCreate();
        showToast("Job Execution Started");
    }

    @Override
    protected void onHandleWork(@NonNull Intent intent) {
        int maxCount = intent.getIntExtra("maxCountValue", -1);
        for (int i = 0; i < maxCount; i++) {
            Log.d(TAG, "onHandleWork: The number is: " + i);
            try {
                Thread.sleep(1000);

            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }


    // Helper for showing tests
    void showToast(final CharSequence text) {
        mHandler.post(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(ExitAppService.this, text, Toast.LENGTH_SHORT).show();
            }
        });
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Intent intent = new Intent(BROADCAST_ACTION);
        sendBroadcast(intent);
    }
}  

Class Application:

public class myApplication extends Application {

    public final static String BROADCAST_ACTION = "com.application.example.action.EXIT";
    BroadcastReceiver receiver;

    @Override
    public void onCreate() {
        super.onCreate();

        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityStopped(Activity activity) {
                try {
                    unregisterReceiver(receiver);
                } catch (Exception e) {

                }
            }


            @Override
            public void onActivityDestroyed(Activity activity) {
                try {
                    unregisterReceiver(receiver);
                } catch (Exception e) {

                }
            }

            @Override
            public void onActivityCreated(final Activity activity, Bundle savedInstanceState) {

                receiver = new BroadcastReceiver() {
                    @Override
                    public void onReceive(Context context, Intent intent) {

                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                            activity.finishAndRemoveTask();
                        } else {
                            activity.finishAffinity();
                        }

                          // Перепробовал все
//                        activity.finish();
//                        System.exit(0);
//                        android.os.Process.killProcess(android.os.Process.myPid());
//                        ActivityManager am = (ActivityManager) getSystemService(Activity.ACTIVITY_SERVICE);
//                        am.killBackgroundProcesses(BuildConfig.APPLICATION_ID);


                    }
                };

                IntentFilter filter = new IntentFilter();
                filter.addAction(BROADCAST_ACTION);
                registerReceiver(receiver, filter);
            }
        });

    }

    @Override
    public void onTrimMemory(int level) {
        super.onTrimMemory(level);
        if (level == ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) {
            Intent mIntent = new Intent(this, ExitAppService.class);
            mIntent.putExtra("maxCountValue", 10);
            ExitAppService.enqueueWork(this, mIntent);
        }
    }
}  

onReceive() работает не должным образом. Не убивает и не очищает полностью приложение из фона.

Может я делаю что то не так? Подскажите правильный путь для этой реализации.


Ответы (1 шт):

Автор решения: Амирхон

В общем нашел работающий вариант, может кому пригодиться:

public class MyExceptionHandler implements Thread.UncaughtExceptionHandler {
    private Activity activity;

    public MyExceptionHandler(Activity a) {
        activity = a;
    }

    @Override
    public void uncaughtException(Thread thread, Throwable ex) {
        Intent intent = new Intent(activity, Splash.class);
        intent.putExtra("crash", true);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
                | Intent.FLAG_ACTIVITY_CLEAR_TASK
                | Intent.FLAG_ACTIVITY_NEW_TASK);

        activity.startActivity(intent);
        activity.finish();
        System.exit(0);
    }
}  

В onCreate() Activity (где может произойти uncaught exception):

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

        Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler(this));  
    }  
→ Ссылка