Java 如何在挂起的意图中设置两个意图

Java 如何在挂起的意图中设置两个意图,java,android,android-intent,android-notifications,Java,Android,Android Intent,Android Notifications,例如,当用户单击通知时,可以设置要启动的多个意图 让我解释一下我的具体问题: 我有一个带有通知的应用程序。每个通知打开一个不同的活动(也有不同的附加内容) 现在我想提取有关通知使用情况的信息。所以,每次打开通知时,我都想启动一个包含一些额外内容的服务 我希望在不修改现有活动的情况下实现这一点,因为它们不会对更改感到“内疚” 理想情况下,伪代码可以是这样的: Intent originalActivityIntent=...; Intent notificationsAnalyticsIntent

例如,当用户单击通知时,可以设置要启动的多个意图

让我解释一下我的具体问题:

我有一个带有通知的应用程序。每个通知打开一个不同的活动(也有不同的附加内容)

现在我想提取有关通知使用情况的信息。所以,每次打开通知时,我都想启动一个包含一些额外内容的服务

我希望在不修改现有活动的情况下实现这一点,因为它们不会对更改感到“内疚”

理想情况下,伪代码可以是这样的:

Intent originalActivityIntent=...;
Intent notificationsAnalyticsIntent=getRegisterNotificationClick(notificationId,username);
PendingIntent pi= PendingIntent.multiple(
                                   context,
                                   originalActivityIntent,
                                   notificationsAnalyticsIntent)
在单击通知时启动两个意图

编写某种服务/广播接收器可能非常复杂,因为我需要为每个活动处理不同的参数

关于如何保持这个清洁有什么想法吗?

没有


我们解决这个问题的方法是,每个
活动
in-out应用程序都是从一些基本活动扩展而来的,在每个通知中,我们都传递了一个额外的通知,希望基本活动能够处理它。

达成了一个非常干净的解决方案。虽然不完美,但它可以工作并保持代码干净,它只需要创建一个适配器活动,并且它对应用程序的其余部分是透明的

在舱单中:

<activity
    android:name="com.tests.AnalyticsActivity"
    android:noHistory="true">
</activity>

我可以通过链接意图来解决这个问题。让挂起的内容启动您的
通知SAnalyticContent
;然后让
notificationsanalyticcontent
启动活动意图。有几种方法可以“告诉”通知意图启动哪个活动。一种方法是将其作为字符串传递

Intent intent = NotificationsAnalyticsIntent.newIntent(applicationContext, SomeActivity.class);
PendingIntent pendingIntent = PendingIntent.getService(applicationContext, 0, intent, 0);
...

public class NotificationsAnalyticsIntent extends IntentService {

    private static final String EXTRA_ACTIVITY_TO_START = "extra_activity_to_start";

    public static Intent newIntent(final Context context, final Class activityToStart) {
        Intent intent = new Intent(context, NotificationsAnalyticsIntent.class);
        intent.putExtra(EXTRA_ACTIVITY_TO_START, activityToStart.getSimpleName());
        return intent;
    }

    public NotificationsAnalyticsIntent() {
        super(NotificationsAnalyticsIntent.class.getSimpleName());
    }

    @Override
    protected void onHandleIntent(@Nullable final Intent intent) {
        // .... do notification stuff
        // TODO

        // .... then start activity
        String activityToStart = intent.getStringExtra(EXTRA_ACTIVITY_TO_START);
        try {
            Class<?> aClass = Class.forName(activityToStart);
            Method method = aClass.getMethod("newIntent", Context.class);
            Context params = getApplicationContext();
            Intent activityIntent = (Intent) method.invoke(null, (Object) params);
            startActivity(activityIntent);

        } catch (ClassNotFoundException | InvocationTargetException | NoSuchMethodException | IllegalAccessException e) {
            // TODO 
        }

    }
}
Intent-Intent=notificationsanalyticcontent.newIntent(applicationContext,SomeActivity.class);
pendingent pendingent=pendingent.getService(applicationContext,0,intent,0);
...
公共类通知分析内容扩展了IntentService{
私有静态最终字符串EXTRA_ACTIVITY_TO_START=“EXTRA_ACTIVITY_TO_START”;
公共静态意图newIntent(最终上下文上下文,最终类activityToStart){
意向意向=新意向(上下文、通知SAnalyticContent.class);
intent.putExtra(EXTRA_ACTIVITY_TO_START,activityToStart.getSimpleName());
返回意图;
}
公共通知分析内容(){
super(notificationsanalyticcontent.class.getSimpleName());
}
@凌驾
受保护的无效onHandleIntent(@Nullable final Intent){
//……做通知的事
//待办事项
//…然后开始活动
String activityToStart=intent.getStringExtra(额外活动到开始);
试一试{
Class aClass=Class.forName(activityToStart);
Method=aClass.getMethod(“newIntent”,Context.class);
上下文参数=getApplicationContext();
Intent-activityIntent=(Intent)方法。调用(null,(Object)参数);
开始触觉(活动意图);
}catch(ClassNotFoundException | InvocationTargetException | NoSuchMethodException | IllegaAccessException e){
//待办事项
}
}
}
若干限制:

  • 活动课必须完全合格。确保activityToStart.getName()返回
    com.example.app.SomeActivity
  • 反射:barf:
  • 如果没有一些额外的丑陋,就不能以自己的意图启动
    SomeActivity

  • 感谢您的回答,我有一个非完美但对我有效的解决方案,请检查线程中的答案。这是一个非常好的解决方案,但可能有一些性能问题(打开一个多余的意图)和一些UI问题(可能会看到“分析活动屏幕”)
    Intent intent = NotificationsAnalyticsIntent.newIntent(applicationContext, SomeActivity.class);
    PendingIntent pendingIntent = PendingIntent.getService(applicationContext, 0, intent, 0);
    ...
    
    public class NotificationsAnalyticsIntent extends IntentService {
    
        private static final String EXTRA_ACTIVITY_TO_START = "extra_activity_to_start";
    
        public static Intent newIntent(final Context context, final Class activityToStart) {
            Intent intent = new Intent(context, NotificationsAnalyticsIntent.class);
            intent.putExtra(EXTRA_ACTIVITY_TO_START, activityToStart.getSimpleName());
            return intent;
        }
    
        public NotificationsAnalyticsIntent() {
            super(NotificationsAnalyticsIntent.class.getSimpleName());
        }
    
        @Override
        protected void onHandleIntent(@Nullable final Intent intent) {
            // .... do notification stuff
            // TODO
    
            // .... then start activity
            String activityToStart = intent.getStringExtra(EXTRA_ACTIVITY_TO_START);
            try {
                Class<?> aClass = Class.forName(activityToStart);
                Method method = aClass.getMethod("newIntent", Context.class);
                Context params = getApplicationContext();
                Intent activityIntent = (Intent) method.invoke(null, (Object) params);
                startActivity(activityIntent);
    
            } catch (ClassNotFoundException | InvocationTargetException | NoSuchMethodException | IllegalAccessException e) {
                // TODO 
            }
    
        }
    }