检测 Activity 启动

Detect Activity Launch

我在项目中使用外部库。显示通知的图书馆。点击该通知会在库中启动 activity。

我想检测 activity 从推送通知启动以跟踪一些分析数据。

有什么方法可以检测这些通知点击或 activity 启动吗?

传递一些额外的元数据以及为显示通知而生成的 pending intent。并在您的目的地 activity 中进行相同的解析。

 Intent destination = new Intent(context, HomeActivity.class);
  destination.putExtra("SOURCE","NOTIFICATION");

    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, destination, PendingIntent.FLAG_CANCEL_CURRENT);

    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context)
            .setContentTitle("Notification Title")
            .setAutoCancel(true)
      .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
            .setContentIntent(pendingIntent)
            .setContentInfo("App")
            .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher))
            .setColor(context.getColor(R.color.colorAccent))
            .setLights(Color.RED, 1000, 300)
            .setPriority(NotificationCompat.PRIORITY_HIGH)
            .setSmallIcon(R.drawable.ic_like);

 NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build());

并且在 activity 级别:

if(getIntent().getStringExtra("SOURCE").equals("NOTIFICATION")){
  // launched from notification
}

如果您的 activity 已经 运行,您的意图可能会传送到:

@Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
    }

当然可以。当你创建 Intent 来启动你的目标 activity 时,你可以将参数传递给意图,当 Activity 开始时,只需从意图中获取外部参数,如果这些参数来自 Notification 做你的行动需要。

据我了解,您 activity 已经在点击通知时启动。要检测 activity 启动,您可以使用 ActivityLifecycleCallbacks。在这种情况下,您将需要覆盖 onActivityCreated/onActivityStarted,其中包括 created/started activity 作为参数。您可以在内部注入分析组件并发送有关已启动活动的事件。

class AppLifecycleCallbacks : ActivityLifecycleCallbacks {
    override fun onActivityStarted(activity: Activity) {
        if (activity is MyActivity) {
            //...
        }
    }

    //...
}