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){
//待办事项
}
}
}
若干限制:
com.example.app.SomeActivity
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
}
}
}