当应用程序以不同方式打开/关闭时显示推送通知 [英] Show push notifications when application open/closed in different way
问题描述
在我的应用程序中,我有几个从一个 BaseActivity 继承的活动.
我的应用程序通过 GCMBaseIntentService
接收推送通知我需要实现下一个逻辑:
收到推送时,如果应用程序打开显示对话框,如果关闭则显示通知.
In my app I've a several Activities that inherit from one BaseActivity.
My application receive push notification with GCMBaseIntentService
I need to implement the next logic:
When push received if the application is open show dialog, if closed show notification.
我的代码:
public class GCMIntentService extends GCMBaseIntentService {
----------------------- other code ----------------------------------------
@Override
protected void onMessage(Context context, Intent intent) {
Log.d(TAG, "onMessage : " + String.valueOf(intent));
// This is how to get values from the push message (data)
String payload = intent.getExtras().getString("payload");
String message = "";
String messageID;
if (payload.contains("{")) {
try {
JSONObject jsonArray = new JSONObject(payload);
message = jsonArray.get("Msg").toString();
messageID = jsonArray.get("MessageID").toString();
GA_Handler.sendEvent("Popup_Push", String.format("Push message %s", messageID));
} catch (Exception ex) {
// Do nothing
}
} else {
message = payload;
}
// special intent with action we make up
Intent pushReceivedIntent = new Intent(ACTION_PUSH);
// place old extras in new intent
pushReceivedIntent.putExtras(intent.getExtras());
// find out if there any BroadcastReceivers waiting for this intent
if (context.getPackageManager().queryBroadcastReceivers(pushReceivedIntent, 0).size() > 0) {
// We got at least 1 Receiver, send the intent
context.sendBroadcast(pushReceivedIntent);
} else {
// There are no receivers, show PushNotification as Notification
// long timestamp = intent.getLongExtra("timestamp", -1);
NotificationManager notificationManager = (NotificationManager) context
.getSystemService(Context.NOTIFICATION_SERVICE);
Notification note = new Notification(R.drawable.ic_launcher, "MYAPP", System.currentTimeMillis());
Intent notificationIntent = new Intent(context, SplashActivity.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
note.setLatestEventInfo(context, "MYAPP", message, pendingIntent);
note.number = count++;
note.defaults |= Notification.DEFAULT_SOUND;
note.defaults |= Notification.DEFAULT_VIBRATE;
note.defaults |= Notification.DEFAULT_LIGHTS;
note.flags |= Notification.FLAG_AUTO_CANCEL;
notificationManager.notify(0, note);
}
}
----------------------- other code ---------------------------------------- }
在我的 BaseActivity 中:
In my BaseActivity:
@Override
protected void onResume() {
super.onResume();
//register as BroadcastReceiver for Push Action
IntentFilter filter = new IntentFilter();
filter.addAction(GCMIntentService.ACTION_PUSH);
mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
DialogFragmentUtils.getNotification("Notification", "Notification");
}
};
registerReceiver(mReceiver, filter);
}
@Override
protected void onPause() {
super.onPause();
FragmentManager fm = getSupportFragmentManager();
for (int i = 0; i < fm.getBackStackEntryCount(); ++i) {
fm.popBackStack();
}
//unregister broadcast receiver
unregisterReceiver(mReceiver);
}
我总是收到通知.
当我调试 context.getPackageManager().queryBroadcastReceivers(pushReceivedIntent, 0).size()
总是等于 0.
I always receive the notifications.
When I debug the context.getPackageManager().queryBroadcastReceivers(pushReceivedIntent, 0).size()
always equals to 0.
谁能告诉我我做错了什么?
Can someone tell me what I'm doing wrong?
推荐答案
PackageManager.queryBroadcastReceivers() 似乎返回在应用程序清单中声明的与给定 Intent 匹配的所有接收器.
It seems that PackageManager.queryBroadcastReceivers() returns all receivers declared in application manifests matching a given Intent.
但是请注意,这不包括使用 Context.registerReceiver() 注册的接收器;目前没有办法获得这些信息.
Note however that this will not include receivers registered with Context.registerReceiver(); there is currently no way to get information about those.
您可以在 onReceive() 中使用以下代码来确定应用程序/活动是否正在运行
You can use the following code in onReceive() to determine if the application/activity is running or not
ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
List<RunningTaskInfo> taskInfo = am.getRunningTasks(1);
Log.d("current task :", "CURRENT Activity ::" + taskInfo.get(0).topActivity.getClass().getSimpleName());
ComponentName componentInfo = taskInfo.get(0).topActivity;
if(componentInfo.getPackageName().equalsIgnoreCase("your.package.name")){
//Activity in foreground, broadcast intent
}
else{
//Activity Not Running
//Generate Notification
}
这篇关于当应用程序以不同方式打开/关闭时显示推送通知的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!