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:将对象从集合小部件传递到活动

使用意图将变量传递给另一个android活动

从 android 推送通知单击启动时,意图数据未在活动中更新

由于 Activity 意图,Android 通知点击导致应用程序崩溃

如何将字节数组一个活动传递给另一个android [重复]

在活动处于前台时接收明确的意图