Android:意图通过通知传递给活动......我在意图中没有得到正确的额外内容
Posted
技术标签:
【中文标题】Android:意图通过通知传递给活动......我在意图中没有得到正确的额外内容【英文标题】:Android: intent passed to an activity by notifications......i don't get the right extras in the intent 【发布时间】:2011-11-21 19:00:33 【问题描述】:您好,我正面临这个问题。我有一个包含 2 个活动的应用程序: -显示汽车列表的活动 A(主要活动) - 如果你点击一个项目列表,Activity B 就会开始显示汽车的详细信息。
在活动 B 中,您可以下载与该车相关的信息,负责下载的服务 C 将启动,并且通知栏会添加通知。如果您单击通知,您应该会看到 Activity B 显示与该特定汽车相关的详细信息。
我的问题如下:活动 B 获得了这个额外的意图:carID 因此,在 onCreate 中,它会额外读取此内容并询问数据库以获取该特定汽车的详细信息。 当我从活动 A 调用活动 B 时,一切正常。但是当我从通知栏中调用活动 B 时,它不会。它总是能得到关于我选择的第一辆车的详细信息。 例如,我下载了法拉利的详细信息,然后下载了兰博基尼的详细信息....
在我的通知中,我将看到 2 个通知,但它们都打开了显示法拉利详细信息的活动 B。
这就是我在服务 C 中创建通知的方式:
int icon = icona;
CharSequence tickerText = message;
long when = System.currentTimeMillis();
Context context = getApplicationContext();
CharSequence contentTitle = message;
CharSequence contentText = appName;
Intent notificationIntent;
notificationIntent = new Intent(this, ActivityB.class);
notificationIntent.putExtra("carId", carId);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Notification notification = new Notification(icon, tickerText, when);
notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
String ns = Context.NOTIFICATION_SERVICE;
NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);
mNotificationManager.notify(NOT_ID, notification);
这就是我在活动 B 中接收意图的方式:
Intent myIntent = getIntent();
appId = myIntent.getIntExtra("carId", 0);
一开始我根本没有从通知中收到任何意图.....然后我添加了 PendingIntent.FLAG_UPDATE_CURRENT,正如您在上面看到的那样,我明白了,但它始终是第一个。我已经验证了,我为每个意向添加了正确的 carId,但我得到了另一个......并且每次打开通知时都会出现此日志消息:
startActivity 从非 Activity 上下文中调用;强制 Intent.FLAG_ACTIVITY_NEW_TASK 用于:Intent cmp=market.finestraprincipale/.ApplicationActivity bnds=[0,101][320,165](有附加功能)
有人可以帮我吗……
【问题讨论】:
ID = 0 你总是得到吗? 在开始时我总是得到 id = 0.......然后我取消了这一行 PendingIntent.getActivity(this, 0, notificationIntent, 0);到 PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);现在我得到了一个值,但它总是一样的......可能是最后一个意图中的 id 被触发了......但我在每个意图中插入了不同的 id :( 【参考方案1】:(原答案已修改,请参阅编辑历史)
我实际上并不确定,您系统的哪个部分出现故障,所以我在这里发布我的测试代码,我测试它可以正常工作。首先是MyService
,然后是TestActivity
,在DetailsActivity
中显示汽车详细信息:
CarService.java
public class CarService extends IntentService
public CarService()
super("CarService");
protected void onHandleIntent(Intent intent)
Bundle extras = intent.getExtras();
if (extras == null)
Log.e("CarService", "Service onHandleIntent null extras");
return;
int carId = extras.getInt("carId");
String carName = extras.getString("name");
Log.i("CarService", "Service onHandleIntent car = " + carName + " with ID = " + Integer.toString(carId));
Intent notificationIntent;
notificationIntent = new Intent(this, DetailsActivity.class);
notificationIntent.putExtra("carId", carId);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pending = PendingIntent.getActivity(this, carId, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Notification notif = new Notification(R.drawable.icon, carName, System.currentTimeMillis());
notif.flags |= Notification.FLAG_AUTO_CANCEL;
notif.setLatestEventInfo(getApplicationContext(), carName, "Car Details", pending);
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(carId, notif);
TestActivity.java(您的主要活动)
public class TestActivity extends Activity implements OnClickListener
@Override public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.test);
Button btn = (Button) findViewById(R.id.launch);
btn.setOnClickListener(this);
@Override public void onClick(View v)
startActivity(new Intent(this, DetailsActivity.class));
test.xml(TestActivity.java 的布局)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:a="http://schemas.android.com/apk/res/android" a:id="@+id/layout_root" a:orientation="vertical" a:layout_ a:layout_>
<TextView a:id="@+id/test_value" a:text="Main..." a:layout_ a:layout_/>
<Button a:id="@+id/launch" a:text="Details" a:layout_ a:layout_/>
</LinearLayout>
DetailsActivity.java(此处列出汽车详细信息 + 启动 CarService + 通知返回此处)
public class DetailsActivity extends Activity implements OnClickListener
private String[] cars = new String[]"Ferrari", "Lamborghini", "Lada", "Nissan", "Opel", "Bugatti";
private int id = 0;
@Override public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.details);
Button btn = (Button) findViewById(R.id.doit);
btn.setOnClickListener(this);
Bundle extras = getIntent().getExtras();
if (extras != null)
final int id = extras.getInt("carId");
Log.i("DetailsActivity", "Car ID: " + id);
TextView tv = (TextView) findViewById(R.id.test_value);
tv.setText("Car ID = " + Integer.toString(id) + ", which is " + cars[id%6]); // id%6 prevents a crash with the string array when clicking test button over 6 times
@Override public void onClick(View v)
Intent intent = new Intent(this, CarService.class);
intent.putExtra("carId", id);
intent.putExtra("name", cars[id%6]); // id%6 prevents a crash with the string array when clicking test button over 6 times
startService(intent);
++id;
details.xml(TestActivity.java 的布局)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:a="http://schemas.android.com/apk/res/android" a:orientation="vertical" a:layout_ a:layout_>
<TextView a:id="@+id/test_value" a:text="No details yet: click the button." a:layout_ a:layout_/>
<Button a:id="@+id/doit" a:text="Test" a:layout_ a:layout_/>
</LinearLayout>
我希望一切都能正常工作,因为我确实做了一些小的改动。
【讨论】:
我还不清楚。他们没有得到任何额外的东西,因为他们没有设置这个标志 PendingIntent.FLAG_UPDATE_CURRENT,但我做到了。因此,它实际上每次我触发通知时都会用新的额外内容刷新我的额外内容,但是它只使用最新的额外原因,因为我的通知中的意图没有区别,所以它总是使用最后一个....我明白了吗?那么我怎样才能让我的所有意图都独一无二呢? 好的,我看到了这里的困难。我将尝试制作一个测试项目,看看它是如何工作的。我也需要构建服务。 顺便说一句,您是否将服务绑定到活动? 您在活动 B 中从哪里收到 Intent?在onCreate
或其他地方?
是的,我看到每辆车都有一个不同的通知.....无论如何现在它可以工作了......这条线缺少 notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);以及待定意图中的 idCar 以使其唯一......我有一个 0 ......以上是关于Android:意图通过通知传递给活动......我在意图中没有得到正确的额外内容的主要内容,如果未能解决你的问题,请参考以下文章
从 android 推送通知单击启动时,意图数据未在活动中更新