2013-07-22 71 views
4

我有一個應用程序,其中包括一個複雜的服務和活動的用戶界面。該應用運行在多個設備上,通過該服務通過WIFI相互通信。如何以編程方式強制完整應用程序重新啓動?例如殺,然後開始

由於該應用程序是一個原型/開發中,我想添加支持「強制重啓」,將殺死應用程序並重新啓動它乾淨。根據使用情況,有很多共享的用戶界面東西被粘連,如果我只需觸摸一個按鈕即可完全重新啓動應用程序,那麼在測試過程中(我有多個設備)會更容易。

因此,沒有任何人有任何建議,如何:

1)強制關閉/停止/殺死你自己的應用程序,從你的應用程序中。

2)設置一個計時器/意圖,告訴操作系統啓動你的應用程序之前關閉/停止/殺死它。

任何提示將不勝感激!謝謝。

+0

這可能會有幫助:http://stackoverflow.com/questions/4337819/android-forcing - 應用程序被徹底重新啓動後被終止?rq = 1 –

+0

您可能已經意識到在開發人員設置中「不要保留活動」。可能會有幫助嗎? – Simon

回答

0

不可以。操作系統決定何時殺死一個應用程序。無論您的應用是真正死亡還是隱藏,您的應用都可以恢復生機。

這很不方便,但平臺就是這樣工作的。您可以通過管理您的活動來產生相同的面向用戶的效果,您可以使用殺死並恢復。

+3

所以你不能Process.killProcess(Process.myPid())你自己的應用程序? – garlicman

+0

你仍然可以殺死事情。否則,像任務殺手這樣的應用程序永遠不會存在,併成爲如此受歡迎的前2.2 – spierce7

0

有可能是一個更正式的方法來做到這一點,但這是我會如何做到這一點。例如,我將假裝只有兩種活動,一種是您當前所在的(我將稱其爲FirstActivity),另一種是「輔助者」活動(我將調用SecondActivity)。

在第一個(您想重新啓動它的那個)中,您將有一個啓動應用程序重新啓動的按鈕。

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

次活動:它的全部目的是使你基本上可以重新開始從應用程式的應用(接近一切,然後在此重新啓動)

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 
     } 

} 

將完全重新啓動的第一個活動。我不確定它是否會像你期望的那樣徹底,但是真的沒有其他方法可以做到這樣的事情。

2

正如你可以看出,完成()是你想要用來殺死一個活動。 A.C.R.的方式可行,但它只會重新啓動您的活動,而不是真正殺死流程,並將其重新啓動。如果這就是你正在尋找的,而不是有一個虛擬的活動,重新啓動您的原始活動,正確的方法是使用標誌。

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

這些標誌會清除你的背部棧一路下跌到任何活動所創建,它會殺死它,然後創建一個新的第一個實例。這實際上是A.C.R的例子,但它更簡潔。

如果這對你來說不夠好,爲了正確地做到這一點,它的工作量相當大,並且需要Android系統的更多高級知識。您希望創建一個在後臺運行的服務(如果您希望應用程序級別狀態被終止,則需要成爲一個單獨的進程),您可以在想要殺死應用程序時啓動該應用程序,讓應用程序自殺或者該服務會爲您取消應用程序,然後讓服務啓動一個旨在啓動您的活動/應用程序備份的意圖。

希望這有助於!祝你好運!

6

使用下面的代碼重新啓動應用程序:

  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); 
+0

'AlarmManager'將有限制與一些Android製造商,如華爲。你最好使用另一種方法 – blueware

+0

小心解釋這段代碼片段如何解決OP的問題? –

1

嘗試下面的代碼重新啓動應用程序。

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

這會擦除活動中定義的靜態變量嗎? –

+0

在運行過程中,如果它們所屬的活動不可見,則可能會終止靜態變量,在這種情況下,返回活動時它們將具有其默認值。 – IamMHussain

0

以下是你需要做什麼:

  1. 創建一個棘手的服務
  2. 殺死killProcess從服務
  3. 然後粘服務將重新啓動調用應用程序,您可以用getLaunchIntentForPackage意圖打開您的應用程序

我喜歡用一個處理器來做到這一點掉在主UI線程:

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 */); 
    } 
} 
相關問題