[Android][Parse] 推送通知 - 在某些活动中拦截应用程序内部的通知并执行某些方法

Posted

技术标签:

【中文标题】[Android][Parse] 推送通知 - 在某些活动中拦截应用程序内部的通知并执行某些方法【英文标题】:[Android][Parse] Push notifications - intercept notification inside the app when being in some activity and execute some method 【发布时间】:2015-05-31 15:40:36 【问题描述】:

我已在我的 android 应用程序上实现 Parse Push Notifications 服务,并将这些行添加到 AndroidManifest.xml:

<service android:name="com.parse.PushService" />
    <receiver android:name="com.parse.ParseBroadcastReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.intent.action.USER_PRESENT" />
        </intent-filter>
    </receiver>
    <receiver android:name="com.parse.ParsePushBroadcastReceiver"
        android:exported="false">
        <intent-filter>
            <action android:name="com.parse.push.intent.RECEIVE" />
            <action android:name="com.parse.push.intent.DELETE" />
            <action android:name="com.parse.push.intent.OPEN" />
        </intent-filter>
    </receiver>
    <receiver android:name="com.parse.GcmBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />

            <category android:name="my.package.name" />
        </intent-filter>
    </receiver>

推送通知运行良好,当用户通过按下推送通知警报启动应用程序时,会启动足够的活动。我发送的推送通知格式如下:

alert: "message to show",
type: "type_1",
data: "some_data"

现在,我不知道该怎么做,只有在进行具体活动时(例如MyActivity),我才想“拦截”对类型标签具有一定价值的推送通知(例如那些是“type_1”)并在该活动上执行一个方法(例如refreshView)以启动异步任务以从服务器检索数据并根据它刷新一些视觉元素。如果用户在另一个活动中(不是MyActivity),推送通知应该正常接收,不会被拦截。

我尝试实现广播接收器但没有成功。我怎样才能做到这一点?

谢谢。

【问题讨论】:

您可以将它们保存在 sharedprefrence 中,当您进入 MyActivity 时检索它们并做您想做的事情 这与我想要的无关。我希望在进行活动时,如果我收到通知,能够拦截它并在该活动上执行方法。我不需要进入任何活动,因为我已经在里面了。 【参考方案1】:

您可以尝试动态注册和取消注册适当的Receiver 以获取通知。 因此,例如在您想要“聆听”的活动中尝试:

private BroadcastReceiver receiver; // Maybe is a good idea to subclass ParsePushBroadcastreceiver...
IntentFilter filter;

@Override
public void onCreate(Bundle savedInstanceState)   
  filter = new IntentFilter();
  filter.addAction("SOME_ACTION");

  receiver = new BroadcastReceiver() 
    @Override
    public void onReceive(Context context, Intent intent) 
      // Received!
    
  
  registerReceiver(receiver, filter); // Actually don't know if it is necessary since i register the receiver in onResume() also...


@Override
protected void onResume() 
     super.onResume();
     registerReceiver(mReciever, mIntentFilter); // Listen when activity goes in foreground


@Override
protected void onPause() 
    super.onPause();
    unregisterReceiver(receive); // Don't listen when activity is not in foreground


@Override
protected void onDestroy() 
  super.onDestroy();
  unregisterReceiver(receiver); // Avoid LEAKED RECEIVER!

目前我没有尝试这个解决方案,但是如果你选择这个,你不应该使用清单注册的接收器,因为它不再依赖于应用程序的生命周期(即接收器运行不管你的应用程序的状态)。

如果您不想保留android manifest registere接收器,也许一个好主意可能是在监听活动进入前台时将静态布尔变量设置为true,在它关闭时设置为false,然后接收器可以这样做基于该布尔值的操作。

不管怎样,看看Context.registerreceiver()和BroadcastReceiver。

干杯!

【讨论】:

以上是关于[Android][Parse] 推送通知 - 在某些活动中拦截应用程序内部的通知并执行某些方法的主要内容,如果未能解决你的问题,请参考以下文章

Parse.com 推送通知延迟或仅在 Android 应用重启后

[Parse][Android] 如何在应用程序运行时禁止显示推送通知?

无法使用 Parse 在 Android 中接收推送通知

如何在 Android 中禁用多个推送通知图标,我正在使用 Parse.com

android 使用 parse.com api 通过推送通知实现聊天

[Android][Parse] 推送通知 - 在某些活动中拦截应用程序内部的通知并执行某些方法