开通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>
}
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>