Notification中Intent携带数据重复问题

Notification中多个Intent使用putExtra方法携带数据,在目的activity中通过getIntent方法取出传递数据时,有时候会发现取出来的数据都是第一次putExtra中放入的数据。

下面看下代码,比较简单:

package com.example.notificationdemo;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;


public class FirstActivity extends Activity {
	
	private Button mButton;
	
	private NotificationManager mNotificationManager;
	private Intent mIntent;
	private PendingIntent mPendingIntent;
	Notification mNotification;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.first);	
		
		mNotification = new Notification();
		mIntent = new Intent(FirstActivity.this, MainActivity.class);
		mIntent.putExtra("hello", "first");
		Log.v("@@@@@@", "this is put in intent first....");
		mNotificationManager = 
				(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
		//主要在于PendingIntent的getActivity方法中的参数
		mPendingIntent = PendingIntent.getActivity(FirstActivity.this, 0, mIntent, PendingIntent.FLAG_UPDATE_CURRENT);
		//如果使用下面注释掉的代码,将会出现上面说讲到的问题,当然在SecondActivity中也必须做修改
		//mPendingIntent = PendingIntent.getActivity(FirstActivity.this, 0, mIntent, 0);
		mButton = (Button)findViewById(R.id.first_button);
		mButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View view) {
				showNotification();
			}
		});
	}
	
	private void showNotification() {  
		
		mNotification.icon = R.drawable.message;
		mNotification.defaults = Notification.DEFAULT_SOUND; 
		mNotification.flags |= Notification.FLAG_AUTO_CANCEL;
		mNotification.tickerText = "第一个";
		mNotification.setLatestEventInfo(FirstActivity.this, "第一个",
				"第一个", mPendingIntent);
		mNotificationManager.notify(0, mNotification);
	}
}

第二个Activity:

package com.example.notificationdemo;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class SecondActivity extends Activity {
	
	private Button mButton;	
	private NotificationManager mNotificationManager2;
	private Intent mIntent;
	private PendingIntent mPendingIntent2;
	Notification mNotification2;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.second);
		
		mNotification2 = new Notification();
		mIntent = new Intent(SecondActivity.this, MainActivity.class);
		mIntent.putExtra("hello", "second");
		Log.v("@@@@@@", "this is doing in second activity");
		mNotificationManager2 = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
		mPendingIntent2 = PendingIntent.getActivity(SecondActivity.this, 1, mIntent, PendingIntent.FLAG_UPDATE_CURRENT);
		//如果使用下面注释掉的代码,将会出现上面说讲到的问题,当然在FirstActivity中也必须做修改(把上面代码注释掉,使用下面行代码,就会重现)
		//mPendingIntent2 = PendingIntent.getActivity(SecondActivity.this, 0, mIntent, 0);
		
		mButton = (Button) findViewById(R.id.second_button);		
		mButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View view) {
				showNotification();
			}
		});	
	}
	
	private void showNotification() {    			
		
		mNotification2.icon = R.drawable.message2;
		mNotification2.defaults = Notification.DEFAULT_SOUND; 
		mNotification2.flags |= Notification.FLAG_AUTO_CANCEL;
		mNotification2.tickerText = "第二个";
		
		Log.v("@@@@@@", "intent put second ...");
		mNotification2.setLatestEventInfo(SecondActivity.this, "第二个", "第二个", mPendingIntent2);
		Log.v("@@@@@@", "do shownotification in second activity");
		mNotificationManager2.notify(0, mNotification2);
		
	}	
}

在MainActivity中接受两个Activity中的Notification传过来的数据:

package com.example.notificationdemo;

import android.os.Bundle;
import android.app.TabActivity;
import android.content.Intent;
import android.graphics.Color;
import android.util.Log;
import android.view.Menu;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.TabHost;

public class MainActivity extends TabActivity implements OnCheckedChangeListener{

	private TabHost mTabHost;
	private RadioGroup mRadioGroup;
	private RadioButton mFirstRadio, mSecondRadio;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        mTabHost = getTabHost();
		mTabHost.addTab(mTabHost.newTabSpec("first").setIndicator("First").setContent(new Intent(this, FirstActivity.class)));
		mTabHost.addTab(mTabHost.newTabSpec("second").setIndicator("Second").setContent(new Intent(this, SecondActivity.class)));
        
        mRadioGroup = (RadioGroup) findViewById(R.id.radiogroup);
		mRadioGroup.setOnCheckedChangeListener(this);
		mFirstRadio = (RadioButton)findViewById(R.id.first_radio);
		mSecondRadio = (RadioButton) findViewById(R.id.second_radio);
		
		Log.v("@@@@@@", "this is doing  in onCreate");
        ChangeChecked(true);
        String str = getIntent().getStringExtra("hello");
    	Log.v("@@@@@@", "the str is " + str);
    	if (str != null && str.equals("first")) {
    		ChangeChecked(true);
    		mTabHost.setCurrentTabByTag("first");
    	} else if (str != null && str.equals("second")) {
    		ChangeChecked(false);
    		mTabHost.setCurrentTabByTag("second");
    	}
        
    }
    
    @Override
    protected void onNewIntent(Intent intent) {    	
    	String str = intent.getStringExtra("hello");
    	if (str != null && str.equals("first")) {
    		ChangeChecked(true);
    		mTabHost.setCurrentTabByTag("first");
    	} else if (str != null && str.equals("second")) {
    		ChangeChecked(false);
    		mTabHost.setCurrentTabByTag("second");
    	}
    	super.onNewIntent(intent);
    	
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

	@Override
	public void onCheckedChanged(RadioGroup group, int checkedId) {
		switch (checkedId) {
		case R.id.first_radio:
			mTabHost.setCurrentTabByTag("first");
			ChangeChecked(true);
			break;
		case R.id.second_radio:
			mTabHost.setCurrentTabByTag("second");
			ChangeChecked(false);
			break;
		default :
			break;
		}
		
	}
	
	private void ChangeChecked(boolean bool) {
		if (bool) {
			mFirstRadio.setTextColor(Color.RED);
			mFirstRadio.setBackgroundResource(R.drawable.tab_front_bg);
			mSecondRadio.setTextColor(Color.BLACK);
			mSecondRadio.setBackgroundColor(Color.TRANSPARENT);
		} else {
			mSecondRadio.setTextColor(Color.RED);
			mSecondRadio.setBackgroundResource(R.drawable.tab_front_bg);
			mFirstRadio.setTextColor(Color.BLACK);
			mFirstRadio.setBackgroundColor(Color.TRANSPARENT);
		}
	}
}

问题主要出自:

mPendingIntent2 = PendingIntent.getActivity(SecondActivity.this, 1, mIntent, PendingIntent.FLAG_UPDATE_CURRENT);
		//如果使用下面注释掉的代码,将会出现上面说讲到的问题,当然在FirstActivity中也必须做修改(把上面代码注释掉,使用下面行代码,就会重现)
		//mPendingIntent2 = PendingIntent.getActivity(SecondActivity.this, 0, mIntent, 0);

看一下getActivity方法:

 PendingIntent android.app.PendingIntent.getActivity(Context context, int requestCode, Intent intent, int flags)


Retrieve a PendingIntent that will start a new activity, like calling Context.startActivity(Intent). Note that the activity will be started outside of the context of an existing activity, so you must use the Intent.FLAG_ACTIVITY_NEW_TASK launch flag in the Intent.

Parameters:
context The Context in which this PendingIntent should start the activity.
requestCode Private request code for the sender (currently not used).
intent Intent of the activity to be launched.
flags May be FLAG_ONE_SHOT, FLAG_NO_CREATE, FLAG_CANCEL_CURRENT, FLAG_UPDATE_CURRENT, or any of the flags as supported by Intent.fillIn() to control which unspecified parts of the intent that can be supplied when the actual send happens.
Returns:
Returns an existing or new PendingIntent matching the given parameters. May return null only if FLAG_NO_CREATE has been supplied.


参数requestCode用于区分Intent,如果flag为FLAG_UPDATE_CURRENT会即使更新intent中数据。

关于该方法的详细概述,敬请查看后面关于notification的源码解析,打算在周末的时候看一下notification源码,那个时候再详细分析下。


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值