2012-11-29 50 views
47

我試圖從類似於Android文檔解釋的通知中啓動活動,但是當我打開通知然後按後退按鈕時,HomeActivity(父級)不會不開放,而是申請關閉。我究竟做錯了什麼?Android - 生成通知,TaskStackBuilder.addParentStack不工作

Intent resultIntent = new Intent(context, MatchActivity.class);; 
    resultIntent.setFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); 

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); 

    // Adds the back stack for the Intent (but not the Intent itself) 
    stackBuilder.addParentStack(MainActivity.class); 

    stackBuilder.addNextIntent(resultIntent); 
+3

對於任何人想知道,公認的答案的作品,但resultIntent.setFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK)不存在在Android文檔。它給了我地獄。 – wsgeorge

回答

87

您需要爲您正在啓動的活動添加父堆棧,而不是父級堆棧。

替換:

stackBuilder.addParentStack(MainActivity.class); 

有:

stackBuilder.addParentStack(MatchActivity.class); 

這假定您已經定義了父在清單(API 16+):

<activity android:name=".MatchActivity" 
    android:parentActivityName=".MainActivity" 
    ... /> 

如果」在API 16下重新開發,那麼您必須將父級定義爲:

<activity android:name=".MatchActivity"> 
    <meta-data 
     android:name="android.support.PARENT_ACTIVITY" 
     android:value=".MainActivity" /> 
</activity> 
+0

它只適用於API級別16和更高。如果你低於那個,那麼你必須使用Manifest中的元標籤。對不起,我必須跑,現在不能得到更詳細的。 – Ralgha

+0

沒問題,謝謝:)我做了這個: <元數據 機器人:名字=」 android.support.PARENT_ACTIVITY。 「 機器人:值=」 MainActivity「/> 但仍然沒有工作... –

+0

又增加了編輯,以顯示該怎麼辦它在API 16 – Ralgha

2

你看過Android文檔,特別是 Notifications API指南。它描述瞭如何詳細執行此操作。

請注意,如果您從通知開始的活動是不正常的活動流程的一部分,那麼它應該轉到應用的開始頁面;相反,它應該轉到主屏幕。

7

使用TaskStackBuilder沒有解決我的問題,只適用於Honeycomb及更高版本。所以,我採取以下解決方案(請不要釘死我):

  1. 呼叫的MainActivity代替MatchActivity,傳遞MatchActivity作爲參數(按意圖)。
  2. MainActivity.onCreate中,如果參數可用,請啓動MatchActivity

新代碼:

Intent resultIntent = new Intent(context, MainActivity.class) // 
     .putExtra(MainActivity.ACTIVITY_EXTRA, MatchActivity.class.getName()) // 
     .putExtra("Pass extras to MatchActivity", "if you want! :)"); 

PendingIntent pendingIntent = PendingIntent.getActivity(context, visitId, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

Notification notification = new NotificationCompat.Builder(context) // 
      .setContentIntent(pendingIntent) // 
      .build(); 

MainActivity

public static final String ACTIVITY_EXTRA = "activity"; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if (getIntent().getStringExtra(ACTIVITY_EXTRA) != null) { 
     startActivity(new Intent(getIntent()).setClassName(this, getIntent().getStringExtra(ACTIVITY_EXTRA))); 
    } 
    ... 
} 
1

在其他的答案說,TaskStackBuilder不低於蜂窩版本。

我的解決方案是覆蓋活動的onBackPressed()方法。

@Override 
public void onBackPressed() { 
    NavUtils.navigateUpFromSameTask(this); 
} 

很顯然,如果您打算以某種其他方式完成活動,您也必須處理該問題。 (雖然我認爲重寫finish()會有一些意想不到的行爲)。

+0

對不起,我沒有工作:( – Hesam

+0

@Hesam它需要你已經表示父活動如圖Ralgha的回答 – kassim

0

我有同樣的問題!解決:

開關

PendingIntent resultPendingIntent = 

PendingIntent.getActivity(this, 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

PendingIntent resultPendingIntent = 

stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 
6
Intent resultIntent = new Intent(App.getContext(), TargetActivity.class); 
Intent backIntent = new Intent(App.getContext(), ParentActivity.class); 
backIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
final PendingIntent resultPendingIntent = PendingIntent.getActivities(
            App.getContext(), 0, 
       new Intent[]{backIntent, resultIntent}, PendingIntent.FLAG_ONE_SHOT); 
mNotifyBuilder.setContentIntent(resultPendingIntent); 

這解決了我與父堆棧問題的通知點擊

1

您應該添加這對AndroidManifest在MainActivity:

<activity 
    android:name=".MainActivity" 
    android:allowTaskReparenting="true" /> 
48

如果所有解決方案都無法正常工作,並且您確信自己一直都很小心謹慎LY ...那麼你需要你卸載的應用程序,並重新安裝。 爲我工作!

+11

不可思議......這是它的我!謝謝 –

+4

當你真的不知道是否快樂或瘋狂的工作:)>:| – Jraco11

+2

它也適用於我,我一點也不高興。一旦我們發佈我們的應用程序,那裏的用戶會發生什麼?卸載和安裝應用程序以獲得此項工作是不可行的。我什麼都不懂... – GoRoS

1

對我來說,stackBuilder.addParentStack沒有工作。

我落得這樣做,希望這會幫助你。

Intent intent = new Intent(context, MatchActivity.class); 

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); 
    // Adds the back stack for the Intent 
    stackBuilder.addNextIntentWithParentStack(new Intent(context, MainActivity.class)); 
    stackBuilder.addNextIntent(intent); 
    PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 
0

如果使用代碼生成在您的項目(如匕首)的MainActivity.class應與MainActivity_.class更換(或任何你父活動的名字是)。花了我整整一天的時間來解決這個問題。希望這可以節省某人的一天。

0

也可能發生這種情況,如果你在mannifest Activiti的旁邊launchMode

<activity android:name=".SecondActivity" 
    ... 
     android:launchMode="singleInstance" 
     android:parentActivityName=".MainActiviy" 
    ... 
/>