2012-08-22 26 views
12

我的應用是在上home鍵,這使應用程序背景並仍在運行]運行模式[前景]和用戶點擊。我在我的應用程序中有報警功能。我想要的是,當我的鬧鐘響起時,我想讓前臺的後臺運行應用程序以及最後的狀態。帶來home鍵用戶點擊後申請前

<application 
      android:name="nl.ziggo.android.state.management.MainEPGApp" 
      android:icon="@drawable/icon" 
      android:label="@string/app_name" 
      android:largeHeap="true" 
      android:logo="@drawable/app_logo" > 
      <activity 
       android:name=".SplashScreen" 
       android:label="@string/app_name" 
       android:launchMode="singleTop" 
       android:screenOrientation="nosensor" 
       android:theme="@style/Theme.Sherlock" > 
       <intent-filter> 
        <action android:name="android.intent.action.MAIN" /> 
        <category android:name="android.intent.category.LAUNCHER" /> 
       </intent-filter> 
      </activity> 
     <activity 
        android:name=".Starter" 
        android:configChanges="orientation|screenSize" 
        android:screenOrientation="behind" 
        android:launchMode="singleTop" 
        android:uiOptions="none" 
        android:windowSoftInputMode="adjustPan" /> 
</application> 

回答

48
Intent intent = new Intent(context, MyRootActivity.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_SINGLE_TOP); 
startActivity(intent); 

你應該用你的起始或MyRootActivity活動。

這會將現有任務帶到前臺而不實際創建新的活動。如果您的應用程序沒有運行,它將創建一個MyRootActivity的實例並啓動它。

編輯

我加Intent.FLAG_ACTIVITY_SINGLE_TOP到意圖,使其真正發揮作用!

第二個編輯

還有另一種方式來做到這一點。當用戶從可用應用程序列表中選擇應用程序時,您可以使用與Android啓動應用程序相同的方式來模擬應用程序的「啓動」。如果用戶啓動一個已經運行的應用程序,Android只會將現有任務放到前臺(這正是您想要的)。像這樣做:

Intent intent = new Intent(context, SplashScreen.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // You need this if starting 
               // the activity from a service 
intent.setAction(Intent.ACTION_MAIN); 
intent.addCategory(Intent.CATEGORY_LAUNCHER); 
startActivity(intent); 
+2

是的,它的工作intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)做了一個小竅門,但我開始作爲新的根活動,它不保留它離開它的狀態。其實我正在5根片段裏面進行Root活動。但是,您的答案是在第一個片段初始化時開始新的根活動。無論如何,這是我必須解決的另一個問題,但到目前爲止,以上答案適用於我。謝謝 – Zoombie

+0

請發佈您的清單。如果你在後臺有一個根活動仍然活動的現有任務(即:未完成**),它不應該創建任何新活動,只需將該任務放到前臺即可。 –

+0

在這裏發生的事情完全一樣,活動仍然活躍,但在後臺模式下,只需將它放在前面。但如何做到這一點,我仍然照顧它 – Zoombie

0

對於報警,你想看看在開始Android Service

此服務會比你的應用程序,它可以在後臺被殺死,可火了一個intent帶來更多的彈性當報警關閉時,將應用程序放在前面(或者在死亡時重新啓動它)。

+0

警報功能正在使用AlarmManager和PendingIntent通過應用程序觸發,它不包含任何Android服務。 – Zoombie

4

,對我工作的組合使用:

Intent bringToForegroundIntent = new Intent(context, RootActivity.class); 
bringToForegroundIntent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(bringToForegroundIntent); 

如果檢查設備上的日誌,每當你從一個啓動器圖標啓動的活動,這是意圖通過啓動應用程序或將其移回前景如果例如用戶單擊主頁按鈕。

+0

接受的答案中沒有任何部分適用於我,但這種方式完全符合我的要求 - 與從Recent應用。 –

4

您可以使用下面的代碼,把應用前:

private void bringApplicationToFront() 
    { 

     Log.d(TAG, "====Bringging Application to Front===="); 

     Intent notificationIntent = new Intent(this, MainActivity.class); 
     notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
     PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); 
     try 
     { 
      pendingIntent.send(); 
     } 
     catch (CanceledException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
+2

這隻適用於應用程序有一個活動。如果應用程序有多個活動,並且用戶不在根活動中,則此代碼不會將應用程序置於與前一個狀態相同的狀態,這是OP的要求。 –

+0

@David Wasser。沒有我的啓動器活動是閃屏,我將MainActivity放在前面,它工作正常。你的解決方案不起作用,所以我把代碼放在這裏。實際上,流程就是這樣的:我的主要活動中有一個廣播接收器,當它接收到廣播時,如果我的主要活動在後臺,那麼我希望主要活動能夠在前面展示。 – Smeet

+1

我的解決方案應該工作,我不知道爲什麼它不。也許你可以開一個新的問題,我們可以看到它爲什麼不起作用。一般來說,如果您不確切知道用​​戶所處的「活動」,那麼您的解決方案將無法正常工作。只有當您確切知道用​​戶處於「MainActivity」中時,它才起作用。您的答案不是一個好的通用解決方案,儘管它可能適用於特定情況。 –

4

我找到了新的方式,使應用前景,它 模仿單擊圖標可啓動應用程序。

PackageManager packageManager = context.getPackageManager(); 
    Intent intent = packageManager.getLaunchIntentForPackage(pkName); 
    if (intent != null) 
    { 
      //模擬點擊桌面圖標的啓動參數 
      intent.setPackage(null); 
     // intent.setSourceBounds(new Rect(804,378, 1068, 657)); 
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); 
      context.startActivity(intent); 

    } 

它爲我工作,但誰可以告訴我爲什麼包必須爲空

1

從我的測試,以模擬發射行爲,關鍵是:

intent.setPackage(null);

之後

Intent intent = packageManager.getLaunchIntentForPackage(pkName);

這個線程中的其他方法在我的情況下不起作用。

感謝嘉慶的回答,我張貼這個答案,因爲我沒有評論權。我也不知道這背後的邏輯,我想這與任務所有者有關。任何人都知道,很高興知道。