当app在后台时,如何在点击通知时打开目标活动

时间:2016-10-19 06:39:55

标签: android firebase notifications

我已使用密钥值对通过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);
    }
}

但是这样我无法通过点击通知打开目标活动。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

如果您需要导航任何Activity,那么应该绑定Notification class(NotificationCompat.Builder),这在实现中是缺失的。

以下行对于重定向任何活动非常重要:

NotificationCompat.Builder builder = new **NotificationCompat.Builder(this); builder.setContentIntent(resultPendingIntent);**

此处resultPendingIntent用于包含活动的backstack,其中包含以下通知:

//获取包含整个后台堆栈PendingIntent

的PendingIntent
resultPendingIntent = 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 对其进行命名。