2010-01-10 79 views
3

我創建了一個應用程序,使用戶能夠設置他是否希望在應用程序以後臺模式運行時接收通知。如果通知已啓用,則應啓動活動(對話框應顯示在屏幕上)。如何在主要活動在後臺運行時啓動活動?

我試着啓用它通過以下方式:

@Override 
public void onProductsResponse(List<Product> products) { 
    this.products = products; 
    moboolo.setProducts(products); 
    if(moboolo.getAutomaticNotificationsMode() != 0 && products.size() > 0){ 
     if(isRunningInBackground) 
     { 
      Intent intent = new Intent(this, ProductListActivity.class); 
      intent.setAction(Intent.ACTION_MAIN); 
      startActivity(intent); 
     } 
    } 
    drawProducts(products); 

} 

這是主要活動的方法。當onPause()被執行時,isRunningInBackground被設置爲true。 當我試圖調試它時,主應用程序在後臺運行

startActivity(意圖)沒有任何效果(活動沒有出現)。

有沒有人知道如何中間邏輯,以便在主要活動在後臺運行時(在調用onPause()之後)從主活動開始活動?

謝謝。

回答

7

您不能強制Activity從運行後臺的應用程序中出現。 The documentation says

如果應用程序在後臺運行,需要用戶的關注,應用程序應該創建一個notificaiton,它允許用戶在他或她方便迴應。

如果您Activity暫停用戶可以做不同的應用程序別的東西,可能不希望自己的Activity突然出現在目前他們正在做的事情上面。您應該使用Status Bar Notification。這允許您的應用程序在狀態欄中放置一個圖標。用戶然後可以滑下狀態欄抽屜並單擊您的通知以打開您的應用程序並顯示相關的Activity。這是絕大多數Android應用程序在後臺運行時通知用戶的方式。

+0

太棒了!這更好。 – 2010-01-10 13:28:36

1
Intent i= new Intent("android.intent.category.LAUNCHER"); 
i.setClass(getApplicationContext(), MyActivity.class); 
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
PendingIntent i2 = PendingIntent.getActivity(getApplicationContext(), 0, insIntent,Intent.FLAG_ACTIVITY_NEW_TASK); 
try { 
    i2.send(getApplicationContext(), 0, i); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

而就MyActivity的onCreate ...

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 

如果主要業務是在後臺運行,這將使您的活動,以正面的事件。

2

要完成Hemendra的回答,除了FLAG_ACTIVITY_REORDER_TO_FRONT之外,您不需要任何這些標誌。您只需從您的正常意圖創建一個PendingIntent並調用新的PendingIntent的send()方法來分發意圖。下面是我做的:

Intent yourIntent = new Intent(this, YourActivity.class); 
// You can send extra info (as a bundle/serializable) to your activity as you do 
// with a normal intent. This is not necessary of course. 
yourIntent.putExtra("ExtraInfo", extraInfo); 
// The following flag is necessary, otherwise at least on some devices (verified on Samsung 
// Galaxy S3) your activity starts, but it starts in the background i.e. the user 
// doesn't see the UI 
yourIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, 
                 yourIntent, 0); 
try { 
    pendingIntent.send(getApplicationContext(), 0, yourIntent); 
} catch (Exception e) { 
    Log.e(TAG, Arrays.toString(e.getStackTrace())); 
} 
+0

謝謝,在這裏使用PendingIntent對我來說是關鍵。以前,我試圖直接調用startActivity,但沒有奏效。 – 2016-09-14 14:43:39