显示推送通知中的片段

时间:2014-10-29 11:09:13

标签: android-intent google-cloud-messaging android-notifications android-fragmentactivity

我正在使用推送通知在我的应用中显示片段,但我的实现似乎不稳定

应用程序运行时以及应用程序未运行时有两种情况

在这两种情况下,我希望应用程序显示特定的片段

这是我的清单文件中的FragmentActivity

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

以下是我创建通知的代码,服务在收到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_CURRENTONE_SHOT但行为仍然相同。

1 个答案:

答案 0 :(得分:2)

所以经过几天试图解决这个问题。我一直无法找到解决这个问题的传统方法,所以我使用了黑客。

  1. 在您的主要活动中定义public static boolean checkIntent = false
  2. 创建一个虚拟活动,当您单击通知时调用该活动

    final PendingIntent contentIntent = PendingIntent.getActivity(
        getApplicationContext(), requestID, new Intent(
                getApplicationContext(), DummyActivity.class).putExtra("data", data), PendingIntent.FLAG_UPDATE_CURRENT);
    
  3. DummyActivity中的
  4. @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();
    }
    
  5. 最后在checkIntent方法

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