在一次开发中,为了利用广播broadcast实现跨应用通讯,写了2个测试应用,BroadcastCrossApps1和BroadcastCrossApps2。
在BroadcastCrossApps1的MainActivity有个按钮,按下事件发送广播至BroadcastCrossApps2的TestReceiver,该TestReceiver启动该应用(即BroadcastCrossApps2)中MainActivity。同样,BroadcastCrossApps2的MainActivity也有发送给BroadcastCrossApps1的TestReceiver的广播。
简单贴出BroadcastCrossApps1的部分代码:
MainActivity.java
Button btn = (Button) findViewById(R.id.button1); btn.setOnClickListener(new View.OnClickListener() { @Override public 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的参数。看来最初的理解错了!
相关推荐
Activity可以启动Service执行长时间任务,通过BroadcastReceiver接收系统或自定义广播事件,通过ContentProvider与其他应用共享数据。理解这些组件的协同工作方式,有助于构建更复杂、功能更丰富的应用。 七、...
广播Receiver(BroadcastReceiver)是Android中实现跨组件通信的一种方式,它可以监听并响应系统或应用发送的自定义广播。在我们的场景中,我们可以创建一个BroadcastReceiver来监听特定的广播事件,并在接收到广播...
2. **自定义广播**(BroadcastReceiver):Android系统提供了广播机制,允许应用程序组件之间进行异步通信。Service可以发送自定义广播,Activity作为注册的接收者,监听并处理这个广播消息。这种方法适合Service和...
Activity是用户界面的主要构成部分,它有五个主要状态:初始状态(不存在于堆栈中)、活动(onResume已调用)、暂停(onPause已调用)、停止(onStop已调用)和销毁(系统不再需要)。当Activity从屏幕移开,但仍然...
在Android开发中,广播是一种非常重要的组件,用于在应用...理解和熟练使用本地广播对于优化应用性能和提高用户体验至关重要。在实际开发中,根据需求选择合适的广播类型,既能满足功能需求,又能兼顾性能和安全性。
Activity跳转与操作是Android开发中的核心概念,对于理解和构建复杂的Android应用至关重要。本资源包"应用源码之(Activity跳转与操作).zip"显然是为了帮助开发者深入理解这一主题。 首先,我们来探讨Activity的生命...
在Android应用开发中,Activity、Bundle、请求码与结果码、Intent、广播和服务是核心组件,它们构成了Android应用运行的基础框架。这篇博文深入探讨了这些概念,并提供了源码分析,帮助开发者更好地理解和运用。 ...
在“activity四大启动方式demo”中,开发者可能会通过Logcat打印出每个Activity的启动过程,包括调用的方法如onCreate()、onStart()、onResume()等,以及相关的taskID。taskID是Android系统分配给每个Task的唯一标识...
3. **使用Application或BaseActivity**:如果你的应用只有一个主Activity或者所有Activity都继承自同一个BaseActivity,可以在BaseActivity的onResume()方法中记录当前Activity,这样就可以随时知道栈顶的Activity是...
Activity的状态包括运行(onResume)、暂停(onPause)、停止(onStop)和销毁(onDestroy)。Android系统根据用户操作和系统需求管理Activity的生命周期。 Intent则是一种意图声明,用来表达应用中的一个动作和...
这个压缩包中的"Android高级应用源码-从注册流程 分析如何安全退出多个Activity 多种方式.zip"提供了相关的源码示例,帮助开发者深入理解这一主题。下面我们将详细探讨如何在Android中实现安全退出多个Activity以及...
在Android应用开发中,Activity是构成应用程序的基本组件,它负责用户界面的呈现和交互。Activity之间的跳转是Android应用中常见的操作,用于实现不同界面之间的切换。本示例程序是针对初学者设计的一个简单教学项目...
在"自己开发的activitydome"描述中,我们可以理解为这是一个个人开发的练习项目,通过创建和管理多个Activity,以及利用Intent进行数据传递,来模拟实际应用中的功能。开发者可能在此过程中学习到如何在不同Activity...
这份"Android应用源码之广播事件处理.zip"的资源包含了一个关于如何在Android应用中处理广播事件的重要源码示例,对开发者深入理解这一核心功能非常有帮助。 首先,我们要明白广播事件的基本概念。在Android中,当...
在需要接收广播的时候,如Activity的onResume()方法中,通过Context的registerReceiver(BroadcastReceiver, IntentFilter)方法注册;在不再需要时,如Activity的onPause()方法中,使用unregisterReceiver...
3. `onResume()`: Activity进入前台并与用户交互,此时用户可以操作Activity。 4. `onPause()`: 当系统准备启动另一个Activity时调用,通常用于保存临时数据和停止动画等。 5. `onStop()`: 当Activity不再可见时调用...
BroadcastReceiver用于接收系统或应用广播事件,如网络状态改变、系统重启等。当接收到广播时,BroadcastReceiver的onReceive()方法会被调用,执行相应的操作。 ContentProvider则负责管理应用间的共享数据,如联系...
通过实践这些示例,初学者可以更好地理解BroadcastReceiver的工作原理和应用场景,为后续的Android开发打下坚实的基础。 总结起来,BroadcastReceiver是Android系统中用于处理广播事件的关键组件。动态注册和静态...