Pertanyaan Cara pemograman paksa aplikasi lengkap dimulai ulang? misalnya bunuh, lalu mulai


Saya memiliki aplikasi yang menyertakan UI layanan dan aktivitas yang kompleks. Aplikasi ini berjalan di beberapa perangkat yang berkomunikasi satu sama lain melalui WIFI melalui layanan.

Karena aplikasi ini adalah prototipe / dalam pengembangan, saya ingin menambahkan dukungan untuk "restart paksa" yang akan mematikan aplikasi dan meluncurkan kembali bersih. Ada banyak hal UI yang dibagikan yang telah di-gummed tergantung pada use case, dan itu akan lebih mudah selama pengujian (saya memiliki beberapa perangkat) jika saya hanya bisa menyentuh tombol untuk me-restart aplikasi sepenuhnya.

Jadi, apakah ada yang punya saran tentang cara:

1) Paksa menutup / menghentikan / mematikan aplikasi Anda sendiri, dari dalam aplikasi Anda.

2) Atur timer / intent yang memberitahu OS untuk meluncurkan aplikasi Anda sebelum Anda menutup / menghentikan / mematikannya.

Tips apa pun akan dihargai! Terima kasih.


5
2017-07-22 18:51


asal


Jawaban:


Gunakan kode di bawah ini untuk memulai ulang aplikasi:

            Intent mStartActivity = new Intent(HomeActivity.this, SplashScreen.class);
            int mPendingIntentId = 123456;
            PendingIntent mPendingIntent = PendingIntent.getActivity(HomeActivity.this, mPendingIntentId, mStartActivity,
                    PendingIntent.FLAG_CANCEL_CURRENT);
            AlarmManager mgr = (AlarmManager) HomeActivity.this.getSystemService(Context.ALARM_SERVICE);
            mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent);
            System.exit(0);

7
2018-03-04 14:01



Seperti yang Anda ketahui, menyelesaikan () adalah apa yang ingin Anda gunakan untuk mematikan suatu aktivitas. Cara A.C.R. akan berfungsi, namun hanya akan memulai kembali aktivitas Anda, tidak benar-benar mematikan proses, dan memulainya kembali. Jika itu yang Anda cari, alih-alih memiliki Aktivitas tiruan yang memulai kembali Aktivitas asli Anda, cara yang benar untuk melakukannya adalah dengan menggunakan bendera.

Intent i = new Intent(this, WrapperActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);

Bendera-bendera itu akan membersihkan tumpukan kembali Anda hingga ke tingkat pertama dari Aktivitas apa pun yang Anda buat, itu akan membunuhnya, dan kemudian membuat yang baru. Ini pada dasarnya adalah apa yang dilakukan oleh A.C.R, tetapi jauh lebih ringkas.

Jika ini tidak cukup baik untuk Anda, Untuk melakukan ini dengan benar, itu sedikit kerja, dan membutuhkan pengetahuan yang lebih canggih dari sistem Android. Anda akan ingin membuat layanan yang berjalan di latar belakang (perlu proses terpisah jika Anda ingin negara tingkat aplikasi terbunuh) yang dapat Anda mulai saat Anda ingin mematikan aplikasi, membiarkan aplikasi tersebut mati sendiri, atau layanan membunuh aplikasi untuk Anda, dan kemudian memiliki layanan meluncurkan maksud yang akan memulai aktivitas / aplikasi Anda kembali.

Semoga ini membantu! Semoga berhasil!


2
2017-07-22 21:33



Coba kode di bawah ini untuk memulai ulang aplikasi.

Intent i = getBaseContext().getPackageManager()
             .getLaunchIntentForPackage(getBaseContext().getPackageName());
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);

1
2017-10-18 07:20



Tidak ada yang bisa dilakukan. Sistem operasi memutuskan kapan harus membunuh aplikasi. Aplikasi Anda dapat hidup kembali apakah benar-benar mati atau tersembunyi.

Ini tidak nyaman, tetapi platform bekerja seperti itu. Anda dapat menghasilkan efek pengguna yang sama dengan mengelola aktivitas Anda, yang Anda bisa bunuh dan kembalikan.


0
2017-07-22 19:00



Mungkin ada cara yang lebih resmi untuk melakukan ini, tetapi inilah cara saya mencapai hal ini.

Sebagai contoh, saya akan berpura-pura hanya ada dua Aktivitas, kegiatan yang sedang Anda ikuti (saya akan menyebutnya FirstActivity), dan Aktivitas "penolong" lainnya (saya akan menelepon SecondActivity).

Dalam yang pertama (yang Anda ingin me-restart dari), Anda akan memiliki tombol yang memulai restart dari aplikasi.

restartButton.setOnClickListener(new OnClickListener(){
        @Override
        onClick(View v){
          //when clicked it starts the helper activity and closes the one you're in
          startActivity(new Intent(this, SecondActivity.class));
          finish(); //or you could use FirstActivity.onDestroy(); if you want it completely dead
        }
});

Aktivitas Kedua: Seluruh tujuan adalah jadi pada dasarnya Anda dapat me-restart aplikasi Anda dari aplikasi Anda (tutup semua yang lain dan kemudian restart dalam hal ini)

Class SecondActivity extends Activity{
        @Override
        onCreate(Bundle savedInstanceState){
                ...
                //it restarts the old activity so it's new and ends this one
                startActivity(new Intent(this, FirstActivity.class));
                finish(); //or you could use SecondActivity.onDestroy(); if you want it
        }

}

Itu akan benar-benar memulai kembali aktivitas pertama. Saya tidak yakin apakah itu akan selengkap yang Anda inginkan, tetapi sebenarnya tidak ada cara lain untuk melakukan hal semacam ini AFAIK.


0
2017-07-22 19:07



Inilah yang perlu Anda lakukan:

  1. Buat Layanan yang sulit
  2. Bunuh aplikasi dengan killProcess panggilan dari Layanan
  3. Layanan Sticky akan memulai ulang, dan Anda dapat membuka aplikasi Anda dengan getLaunchIntentForPackage maksud

Saya suka menggunakan Handler untuk melakukan ini dari utas UI utama:

private void scheduleForceClose() {
    final Handler closeAppHandler = new Handler();
            closeAppHandler.post(new Runnable() {
                @Override public void run() {   
                 prefs.edit().putBoolean(StringConstants.FORCE_CLOSED_APP, true).commit();                        
                        Log.i(TAG, "Gonna force kill the app process completely!");
                        System.exit(0);
             android.os.Process.killProcess(android.os.Process.myPid());                        
                }
            });

}

private void scheduleForceOpen() {
    final Handler openAppHandler = new Handler();
    taskOpenApp = new TimerTask() {
        @Override public void run() {
            openAppHandler.post(new Runnable() {
                @SuppressLint("ApplySharedPref") @Override public void run() {
                    Intent intent = getPackageManager().getLaunchIntentForPackage("com.company.yourpackagename");
                    // Reset the force-close flag so that the close timer can begin again                
                    prefs.edit().putBoolean(StringConstants.FORCE_CLOSED_APP, false).commit();
                    startActivity(intent);
                }
            });
        }
    };

    // Decide whether we already force-closed the app, so that we don't repeat it
    boolean alreadyForceClosed = prefs.getBoolean(StringConstants.FORCE_CLOSED_APP, false);
    if (alreadyForceClosed) {
        Log.i(TAG, "App process has already been killed, so schedule app relaunch.");
        Timer timerOpen = new Timer();
        timerOpen.schedule(taskOpenApp, 5000 /* reopen the app after 5 sec */);
    }
}

0
2018-01-17 14:44