例如,当用户点击通知时,可以设置多个启动意图。
让我解释一下我的具体问题:
我有一个带通知的应用。每个通知都会打开一个不同的活动(也有不同的附加功能)。
现在我想提取有关通知用法的信息。因此,每次通知开放时,我都想推出一些额外的服务。
我希望在不修改现有活动的情况下实施,因为他们并非“有罪”。变化。
理想情况下,伪代码可能是这样的:
Intent originalActivityIntent=...;
Intent notificationsAnalyticsIntent=getRegisterNotificationClick(notificationId,username);
PendingIntent pi= PendingIntent.multiple(
context,
originalActivityIntent,
notificationsAnalyticsIntent)
单击通知时启动两个意图。
编写某种服务/广播接收器可能非常复杂,因为我需要为每个活动处理不同的参数。
关于如何保持清洁的任何想法?
答案 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
}
}
}
几个限制:
com.example.app.SomeActivity
SomeActivity
不能以其自己的意图而开始