Pertama, saya tahu bahwa seseorang seharusnya tidak benar-benar mematikan / memulai ulang aplikasi di Android. Dalam kasus penggunaan saya, saya ingin mengatur ulang pabrik aplikasi saya dalam kasus tertentu di mana server mengirimkan informasi tertentu ke klien.
Pengguna hanya dapat login di server dengan SATU instance aplikasi (yaitu beberapa perangkat tidak diperbolehkan). Jika instance lain mendapatkan "login" -kunci maka semua instance lain dari pengguna tersebut harus menghapus data mereka (reset pabrik), untuk mempertahankan konsistensi.
Dimungkinkan untuk mendapatkan kunci secara paksa, karena pengguna mungkin menghapus aplikasi dan menginstalnya kembali yang akan menghasilkan id-instance yang berbeda dan pengguna tidak akan dapat membebaskan kunci lagi. Karena itu dimungkinkan untuk mendapatkan kunci secara paksa.
Karena kemungkinan-kekuatan itu kita perlu selalu memeriksa secara konkret bahwa ia memiliki kunci. Itu dilakukan pada (hampir) setiap permintaan ke server. Server mungkin mengirim "salah-kunci-id". Jika itu terdeteksi, aplikasi klien harus menghapus semuanya.
Itu adalah kasus penggunaan.
Saya memiliki nilai Activity
A yang memulai Login Activity
L atau Activity
B utama aplikasi tergantung pada nilai sharedPrefs. Setelah memulai L atau B itu menutup sendiri sehingga hanya L atau B yang berjalan. Jadi dalam hal pengguna sudah masuk B sedang berjalan sekarang.
B dimulai C. C panggilan startService
untuk IntentService
D. Itu hasil di tumpukan ini:
(A)> B> C> D
Dari metode onHandleIntent dari D, sebuah event dikirimkan ke ResultReceiver R.
R sekarang menangani acara itu dengan menyediakan dialog kepada pengguna di mana ia dapat memilih untuk mengatur ulang aplikasi (menghapus database, sharedPrefs, dll.)
Setelah reset pabrik saya ingin me-restart aplikasi (untuk menutup semua aktivitas) dan hanya memulai A lagi yang kemudian meluncurkan login Activity
L dan menyelesaikan sendiri:
(A)> L
Metode onClick Dialog terlihat seperti ini:
@Override
public void onClick(DialogInterface dialog, int which) {
// Will call onCancelListener
MyApplication.factoryReset(); // (Deletes the database, clears sharedPrefs, etc.)
Intent i = new Intent(MyApp.getContext(), A.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
MyApp.getContext().startActivity(i);
}
Dan itulah MyApp
kelasnya:
public class MyApp extends Application {
private static Context context;
@Override
public void onCreate() {
super.onCreate();
context = getApplicationContext();
}
public static Context getContext() {
return context;
}
public static void factoryReset() {
// ...
}
}
Masalahnya adalah jika saya menggunakan FLAG_ACTIVITY_NEW_TASK
Aktivitas B dan C masih berjalan. Jika saya menekan tombol kembali pada login Activity
saya melihat C, tetapi saya ingin kembali ke layar beranda.
Jika saya tidak mengatur FLAG_ACTIVITY_NEW_TASK
saya mendapat kesalahan:
07-07 12:27:12.272: ERROR/AndroidRuntime(9512): android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
Saya tidak dapat menggunakan Kegiatan ' Context
, karena ServiceIntent
D juga dapat dipanggil dari tugas latar belakang yang dimulai oleh AlarmManager
.
Jadi bagaimana saya bisa menyelesaikan ini hingga tumpukan aktivitas menjadi (A)> L?