Activity中onNewIntent()方法使用需要注意的点

开通CSDN博客已经有几天了,这几天在里面逛了逛,看见了许多大神们分享的技术以及学习各种编程语言的心得、历程和建议,深受启发,觉得这是一个很好的技术交流平台,也为个人技术的成长提供了一个良好的环境。所以今天准备开始写自己的第一篇博客,虽然自己的技术很差很差,但是个人觉得技术由弱到强也是需要一个积累和沉淀的过程,所以我希望在这个平台里记录自己学习的过程,也是后期回顾和复习的一个很好的工具,同时也希望大神们能帮忙指正我学习过程中的错误和不足之处,当然更希望通过大神们的帮助尽快提升自己的技术能力,能解答CSDN中其他技术人员提出的问题帮助他们一起成长!

一直在学习和使用与Intent有关的各种方法,却很少使用到Activity中onNewIntent()方法。最近使用过一次,发现这个方法还是蛮好用的,就是在使用的过程中需要注意几个点,否则会达不到效果。所以,在这里分享出来,也是给后期自己复习做了个记录。
例如,我们在需要通过Activity启动一个Service是需要Service把数据再回传给Activity。具体的实现方法有很多,可以通过发广播的机制,也可以通过handler来传递消息。这里我使用的是用Intent来传递数据。
下面这段代码是MainActivity中启动了一个Service是MyService01,需要MyService01把数据再回传给MainActivity(这里是在MyService01类中虚拟了一个数据)

public class MainActivity extends Activity {
	
	private TextView tv01;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		tv01=(TextView) findViewById(R.id.textView1);
	}

	public void onClick(View v){
		startService(new Intent(this,MyService01.class));
	}
	/**此方法何时执行?
	 * 此Activity的launchMode为singleTop时*/
	@Override
	protected void onNewIntent(Intent intent) {
		<span style="color:#3366ff;">tv01.setText(intent.getStringExtra("data"));
		super.onNewIntent(intent);</span>
	}

下面是MyService01类,继承了IntentService类,其中onhandleIntent是在工作线程中运行的
public class MyService01 extends IntentService {
	public MyService01() {
		super("MyService01");
	}

	/**此方法运行在工作线程*/
	@Override
	protected void onHandleIntent(Intent intent) {
		<span style="color:#ff0000;">String data="技术的成长是一个积累和沉淀的过程,需要不断地学习";
		Intent it=new Intent(this,MainActivity.class);</span>
<span style="color:#ff0000;"><span style="white-space:pre">		</span>it.putExtra("data",data);
		startActivity(it);</span>
	}
}
按照以上代码运行以后会出现错误,下面是logcat打印的日志,需要我们在MyService01中的Intent加上了一个FLAG属性:FLAG_ACTIVITY_NEW_TASK



	@Override
	protected void onHandleIntent(Intent intent) {
		<span style="color:#cc33cc;">String data="技术的成长是一个积累和沉淀的过程,需要不断地学习";
		Intent it=new Intent(this,MainActivity.class);
		it.putExtra("data", data);
		it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
		startActivity(it);</span>
	}


按照打印日志提示的修改以后运行logcat没有日志报错,但是MainActivity中也没有得到MyService01中回传那段文字数据


但是追踪onNewInent的源代码就会发现,这个方法还要所在activity的启动模式必须是singleTop模式,所以在AndroidManifest.xml清单配置文件中加上了MainActivity的启动模式为singleTop,不设置的话是默认standard模式

 <activity
            android:name="com.example.dayy1903.MainActivity"
            android:label="@string/app_name"
            android:launchMode="singleTop" >

设置好启动模式以后的运行结果就是我们想要的结果,在MainActivity中得到了MyService01中回传的数据:"技术的成长是一个积累和沉淀的过程,需要不断地学习"



最后总结一下:如果在Service中通过intent传递数据给Activity,那么需要在Activity中onNewIntent()方法中得到回传的数据。要使这个方法有效需要注意两个要点:

1.Service类中onHandleIntent()方法中Intent加上以下的Flags属性:Intent.FLAG_ACTIVITY_NEW_TASK;

<span style="font-size:18px;">     2.需要在AndroidManifest.xml清单配置文件中将onNewIntent()方法所在的Activity的启动模式设置为:SingleTop模式</span>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值