Как убить и очистить приложение в фоне?
Такая ситуация, если приложение находиться некоторое время в фоне, когда снова открываешь, ошибка.
Для этого реализовал следующее:
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));
}