0

我使用推送通知顯示在我的應用程序片段顯示片段,但我的實現看起來不穩定從推送通知

有應用程序運行時兩種情況,當應用程序沒有運行

在這兩種情況下我希望應用程序顯示特定片段

這是我FragmentActivity在我的清單文件

<activity 
     android:name=".Main" 
     android:label="@string/app_name" 
     android:screenOrientation="portrait" 
     android:theme="@style/Theme.NoBackground" 
     android:windowSoftInputMode="adjustPan" > 
    </activity> 

這裏爲m Ÿ代碼當它收到一個GCM消息

private void sendNotification(String message) { 

    NotificationManager mNotificationManager = (NotificationManager) this 
      .getSystemService(Context.NOTIFICATION_SERVICE); 

    int requestID = (int) System.currentTimeMillis(); 

    final PendingIntent contentIntent = PendingIntent.getActivity(
      getApplicationContext(), requestID, new Intent(
        getApplicationContext(), Main.class).setAction(Actions.SHOW_FRIENDS_FRAGMENT), PendingIntent.FLAG_UPDATE_CURRENT); 

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
      this) 
      .setSmallIcon(R.drawable.notification_icon) 
      .setAutoCancel(true) 
      .setContentText(message) 
      .setSound(
        RingtoneManager 
          .getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)); 

    mBuilder.setContentIntent(contentIntent); 
    mNotificationManager.notify(Util.getApp().getNotificationId(), mBuilder.build()); 
} 

一個在我的活動創建通知,這是由服務,稱爲我在這兩個的onCreate和onNewIntent

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    checkIntent(intent); 
} 

@Override 
protected void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); 
    checkIntent(intent); 
} 

private void checkIntent(Intent i){ 
    try{ 
     String action = i.getAction(); 

     if(action != null){ 
      if(action.equalsIgnoreCase(Actions.SHOW_FRIENDS_FRAGMENT)){ 
       showFriendsFragment(); 
      } 
     } 
    }catch(Exception e){ 

    } 
} 

檢查的問題是,如果動作在應用程序重新啓動時在onCreate中找到,動作仍然存在,因此它始終在該頁面上啓動。 在onNewIntent中找到該操作時不會發生該行爲,但僅在該應用程序正在運行時纔會調用該行爲。

我試過使用臨時演員,並顯示片段後,刪除他們更改掛起意圖標誌CANCEL_CURRENT,ONE_SHOT但行爲仍然是相同的。

回答

2

因此經過幾天的努力找出這一點。我一直無法找到任何傳統的方法來解決這個問題,所以我使用了黑客技術。

  1. 在您的主要活動定義public static boolean checkIntent = false
  2. 創建被稱爲一個虛擬的活動,當你在DummyActivity的通知點擊所以

    final PendingIntent contentIntent = PendingIntent.getActivity(
        getApplicationContext(), requestID, new Intent(
          getApplicationContext(), DummyActivity.class).putExtra("data", data), PendingIntent.FLAG_UPDATE_CURRENT); 
    
  3. @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    
    Intent i = getIntent(); 
    if (i != null) { 
        String data = i.getStringExtra("data"); 
        Main.checkIntent = true; 
        startActivity(new Intent(getBaseContext(), Main.class).putExtra(
          "data", data)); 
    } 
    finish(); 
    } 
    
  4. 最後在checkIntent方法中

    private void checkIntent(Intent i){ 
    try{ 
    String data = i.getStringExtra("data"); 
    
    if(data!= null){ 
        checkIntent = false; 
        showFriendsFragment(); 
    } 
    }catch(Exception e){ 
    
    } 
    }