我已使用密钥值对通过firebase控制台发送通知,并在启动器活动中处理通知。下面是尝试过的代码:
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (intent.hasExtra("click_action")) {
ClickActionHelper ck=new ClickActionHelper();
ck.startActivity(intent.getStringExtra("click_action"), intent.getExtras(), this);
}
}
public class ClickActionHelper {
public void startActivity(String className, Bundle extras, Context context){
Class cls=null;
try {
cls = Class.forName(className);
}catch(ClassNotFoundException e){
}
Intent i = new Intent(context, cls);
i.putExtras(extras);
context.startActivity(i);
}
}
但是这样我无法通过点击通知打开目标活动。有什么想法吗?
答案 0 :(得分:2)
如果您需要导航任何Activity,那么应该绑定Notification class(NotificationCompat.Builder)
,这在实现中是缺失的。
以下行对于重定向任何活动非常重要:
NotificationCompat.Builder builder = new **NotificationCompat.Builder(this); builder.setContentIntent(resultPendingIntent);**
此处resultPendingIntent
用于包含活动的backstack,其中包含以下通知:
//获取包含整个后台堆栈PendingIntent
的PendingIntentresultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
完整的代码段可用here。
int id = 1;
Intent resultIntent = new Intent(this, ResultActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
// Adds the back stack
stackBuilder.addParentStack(ResultActivity.class);
// Adds the Intent to the top of the stack
stackBuilder.addNextIntent(resultIntent);
// Gets a PendingIntent containing the entire back stack
PendingIntent resultPendingIntent =
stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentIntent(resultPendingIntent);
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(id, builder.build());
修改强>
假设您已从服务器设置响应,如下所示
{ “registration_ids”:[“XXX”,...], “数据”:{ “id_offer”:“41” }, “通知”:{ “标题”:“这是标题”, “text”:“你好,我是通知”, “icon”:“ic_push”, “click_action”:“ACTIVITY_XPTO” } }
并在您的清单文件中
<activity android:name=".ActivityXPTO" android:screenOrientation="sensor" android:windowSoftInputMode="stateHidden"> <intent-filter> <action android:name="ACTIVITY_XPTO" />
<category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
当应用关闭或在后台并且用户点击通知时,它会打开我的ActivityXPTO
,以检索我只需要执行的id_offer
:
public class ActivityXPTO extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
String idOffer = "";
Intent startingIntent = getIntent();
if (startingIntent != null) {
idOffer = startingIntent.getStringExtra("id_offer");
// Retrieve the id
}
getOfferDetails(id_offer);
}
}
}
以第二种方式
通过下面的数据有效负载发送密钥,并通过getIntent()获取MainActivity中的密钥,并调用特定的活动或片段。
json1.put(“title”,“Your Title”);
json1.put(“body”,“body content”);
json1.put(“message”,“Your Message”);
json1.put( “屏幕”, “2”); // secondFragment是导航抽屉中的第二个位置
json.put(“data”,json1);
GitHub上的示例项目。
答案 1 :(得分:-1)
没有任何东西适合我。对我来说,事情很简单。确保将其添加到要直接打开的活动中。
<intent-filter>
<action android:name="MainActivity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
并且必须从推送通知中添加新的有效负载: click_action 看起来像这样-
"notification": {
"title": "hello",
"body": "test message",
"click_action": "MAIN_ACTIVITY"
},
注意:您可以根据需要 MAIN_ACTIVITY 对其进行命名。