首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

activity onResume的了解,跨应用广播

2013-09-05 
activity onResume的理解,跨应用广播Button btn (Button) findViewById(R.id.button1)btn.setOnClickLi

activity onResume的理解,跨应用广播
Button btn = (Button) findViewById(R.id.button1);btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Time time = new Time();time.setToNow();Intent intent = new Intent("info.zhegui.broadcast2");intent.putExtra("value", "来自broadcast1的广播 " + time.format2445());sendBroadcast(intent);//finish(); //此处的finish帮助我们分析onResume结果}});

?TestReceiver.java

Log.e(TAG,"TestReceiver 1 onReceive()"+ intent.getStringExtra("value"));Intent intent2=new Intent();intent2.setClass(context, MainActivity.class);intent2.putExtra("value", intent.getStringExtra("value"));intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(intent2);

AndroidManifest.xml

<permission android:name="info.zhegui.broadcast2" />    <uses-permission android:name="info.zhegui.broadcast1" />    <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <activity            android:name="info.zhegui.broadcast1.MainActivity"            android:label="@string/app_name"            android:launchMode="singleTop" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <receiver android:name="info.zhegui.broadcast1.TestReceiver" >            <intent-filter>                <action android:name="info.zhegui.broadcast1" />            </intent-filter>        </receiver>    </application>

?

接下来测试,表面上的效果是:点应用1?MainActivity的按钮可以启动应用2的MainActivity,点应用2?MainActivity的按钮可以应用应用1的MainActvitiy,循环的效果。实际上是:?应用1的MainActivity按钮事件发送广播,启动应用2的TestReceiver,再由应用2的TestReceiver启动应用2的MainActivity。接着就用rMainActivity按钮事件发送广播,启动应用1的TestReceiver……

?

一,跨应用的通讯(广播)已经实现了,接下来问题产生了。就是,如果两个应用最初都是通过adt安装并启动,即在MainActivity已启动onCreate()的情况下,为什么在MainActivity的onResume()中获取不到getIntent()中的value值呢?

?

按最初的理解,startActivity()时,如果该activity已经启动oncreate(),那么会跨过onCreate()而直接调用onResume(),这样在onResume()中可通过getIntent()获取到传来的intent。这时本应该可正常获取intent中的value值的!

但实际上并没有!

?

二,为了作个对比,通过DDMS的devcies视图,将其中一个应用stop掉,这里我们假设stop应用1。我们通过应用2的按钮启动应用1的MainActivity,这时应用1 的activity在onResume()时获取到了getIntent()的value值!

但继续点击应用1的按钮,应用2没有获取到value值。循环点击两个应用的按钮,都只有应用1获取的value值,应用2获取不到!

?

三,再作个对比,根据同事灰太狼建议,把MainActivity的按钮事件中已经注释掉的finish的注释去掉,使该行代码有效!再运行其中一应用,然后循环点击两个应用的按钮。这次两个应用都可获取至value值

?

结论:

通过上面的对比,我们可以唯一可以想到造成这个原因的是,当activity已onCreate()后,startActivity()的效果只是将该activity显示而已,却无法将intent中的参数传递给activity。与最初的理解不同,最初我认为,如果该activity已onCreate(),那么onResume()仍可获取intent的参数。看来最初的理解错了!

?

热点排行