如何在待处理的意图中设置两个意图

时间:2015-05-27 10:47:41

标签: java android android-intent android-notifications

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

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

我有一个带通知的应用。每个通知都会打开一个不同的活动(也有不同的附加功能)。

现在我想提取有关通知用法的信息。因此,每次通知开放时,我都想推出一些额外的服务。

我希望在不修改现有活动的情况下实施,因为他们并非“有罪”。变化。

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

Intent originalActivityIntent=...;
Intent notificationsAnalyticsIntent=getRegisterNotificationClick(notificationId,username);
PendingIntent pi= PendingIntent.multiple(
                                   context,
                                   originalActivityIntent,
                                   notificationsAnalyticsIntent)

单击通知时启动两个意图。

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

关于如何保持清洁的任何想法?

3 个答案:

答案 0 :(得分:2)

没有

我们解决这个问题的方法是,每个Activity in app都会扩展一些基本活动,并且在每个通知中,我们会在基本活动处理它的意图中传递额外内容。

答案 1 :(得分:0)

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

在清单中:

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

和java代码:

public class AnalyticsActivity extends Activity {

    private static final String KEY_INTERNAL_COMPONENT = "com.tests.AnalyticsReceiver.COMPONENT";
    private static final String KEY_NOTIFICATION_TYPE = "com.tests.AnalyticsReceiver.NOTIFICATION_TYPE";
    private static final String KEY_USERNAME = "com.tests.AnalyticsReceiver.USERNAME";

    public static Intent getLaunchIntent(
            Context context, Intent intent, long notificationType, String username) {
        intent.putExtra(KEY_INTERNAL_COMPONENT, intent.getComponent());
        intent.setComponent(new ComponentName(context, AnalyticsActivity.class));
        intent.putExtra(KEY_NOTIFICATION_TYPE, notificationType);
        intent.putExtra(KEY_USERNAME,username);
        return intent;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(savedInstanceState==null){
            Intent intent=getIntent();
            long notifType=intent.getLongExtra(KEY_NOTIFICATION_TYPE, 0);
            String username=intent.getStringExtra(KEY_USERNAME);
            Log.e("RegisterEvent", "notif=" + notifType + ",username=" + username);
            ComponentName componentName=intent.getParcelableExtra(KEY_INTERNAL_COMPONENT);
            intent.setComponent(componentName);
            startActivity(intent);
        }
    }

}

答案 2 :(得分:0)

我基本上可以通过链接意图来解决这个问题。让PendingIntent开始您的NotificationsAnalyticsIntent;然后让NotificationsAnalyticsIntent启动活动意图。有几种方法可以“告诉”通知意图,即要开始的活动。一种方法是将其作为字符串传递。

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 
        }

    }
}

几个限制:

  1. 活动类别必须完全合格。确保activityToStart.getName()返回com.example.app.SomeActivity
  2. 反射:barf:
  3. 在没有一些丑陋感的情况下,SomeActivity不能以其自己的意图而开始