`
xinanadu
  • 浏览: 227665 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

activity onResume的理解,跨应用广播

阅读更多

在一次开发中,为了利用广播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的参数。看来最初的理解错了!

 

0
3
分享到:
评论

相关推荐

    Android Activity中onStart()和onResume()的区别分析

    主要介绍了Android Activity中onStart()和onResume()的区别,结合Activity的四种状态简单分析了Android Activity中onStart()和onResume()方法的作用,并补充说明了Activity中六个常用函数,需要的朋友可以参考下

    Activity生命周期演示

    启动(销毁-活动):onCreate、onStart、onResume 活动-暂停:onPause;暂停-活动:onResume 活动-停止:onPause、onStop;停止-活动:onRestart、onStart、onResume 活动-销毁:onPause、onStop、onDestroy 日志...

    Android面试题-Activity A跳转Activity B,再按返回键,生命周期执行的顺序?

    最近在准备面试,碰到这一题...在A跳转B会执行:A onPause -&gt; A onStop -&gt; B onCreate -&gt; B onStart -&gt; B onResume 在B按下返回键会执行:B onPause -&gt; B onStop -&gt; B onDestroy -&gt; A onRestart -&gt; A onStart -&gt; A on

    Activity 的生命周期 以及 横屏竖屏切换时 Activity 的状态变化

    Activity 的生命周期 以及 横屏竖屏切换时 Activity 的状态变化 例如: 切换到横屏 onSaveInstanceState onPause onStop onDestroy onCreate onStart onRestoreInstanceState onResume

    Activity_04(Activity的声明周期--Activity Lifecycle--代码

    Activity_04(Activity的声明周期--Activity Lifecycle--代码. 包含onCreate,onStart,onRestart,onResume,onPause,onStop,onDestroy 的之行顺序等。。

    Android AOSP 6.0.1 registerReceiver广播注册流程分析

    广播作为 Android 开发的四大组间之一,当我们发送广播以后,发生了什么?广播接收者最终如何收到了广播。 一、复盘广播的使用 在 Android 开发中使用广播分为三个步骤: 1.新建广播接收者 BroadcastReceiver; 2....

    Android代码-DialogUtil

    if you do not invoke setActivity(activit), please invoke show() after in or after the activity onResume,or it may show in previous activity! about BadWindowTokenException,see the blog:关于dialog,...

    android下activity生命周期

    onResume() 这个回调在应用程序与用户开始可交互的时候调用 onPause() 被暂停的活动无法接受用户输入,不能执行任何代码。当当前活动将要被暂停,上一个活动将要被恢复是调用 onStop() 当活动不在可见时调用 ...

    Android代码-TCClick统计平台安卓客户端

    重载你的Activity的onResume方法和onPause方法,可以编写一个重载了Activity的基类来做这件事情,然后让应用中所有的其他Activity都继承这个基类,如: public class BaseActivity extends Activity { public ...

    activiti-userguide-5-16中文开发手册(pdf版)

    在深入了解Activity之前,我们先要知道一下MVC设计模式,在JAVAEE 中MVC设计模式已经很经典了,而且分的也比较清晰了,但是在Android中,好多人对MVC在Android开发中的应用不是很清楚,下面我就先来介绍一下MVC在...

    Activity页面的绘制流程

    其实并不然,Activity的页面是在Activity的onResume方法执行完成后才会被绘制,且绘制完成的时长与我们主线程当时的状态和布局的层级以及CPU内存都是有一定的关系,这些也是我们分析Activity启动黑屏主要方向。...

    Android activity原理分析

    主要是讲android的activity工作原理,比如onCreate,onstart,onRestart,onResume,等这些函数的执行时机,调用逻辑,有详细的流程图;

    android activity 生命周期

    1. 最上層(即焦點所在)。 2. 不在最上層,但被上層蓋掉一部份(還有一部份可看到)。...Activity 是我们开发Android应用程序最重要的一个类。这个类的内容比较多,我理解多少 就写多少,希望你喜欢:)

    Activity生命周期Demo

    Activity的生命周期有:onCreate(),onStart(),onResume() ,onPause(), onStop(), onDestroy(),onRestart();

    关于Activity中获取View宽高的那些事

      原因在于View的Measure过程和Activity的生命周期方法不是同步执行的,因此无法保证Activity执行了onCreate、onStart、onResume时某个View已经测量完毕,如果View没有测量完毕,那么获得的宽高就是0。

    Activity启动时候获取View宽高的四种方法

    Activity启动时候获取View宽高的四种方法,因为Activity的生命周期回调和view的measure过程不是同步执行的,所以无法在activity的onCreate、onStart和onResume里面准确的获取view的宽和高,可以通过以下四个方法来...

    安卓编程与应用

    activity 类是 Android 应用生命周期的重要部分。 前台的生命周期,从 onResume()开始到 onPause()结束。在这段时间 里,该 Activity 处于所有 Activity 的最前面,和用户进行交互。 Activity 可以经常性地在 ...

Global site tag (gtag.js) - Google Analytics