android onActivityResult()接收返回数据为null的解决方案

对于·app多个界面管理,如果一般使用Activity默认的加载模式,按返回键就会退回上一次操作,就是一种新建一个Activity实例。时间长了就会变得卡顿,一般人会选择手动地在代码中屏蔽返回键,使用app中开发的返回键,这样也可以解决问题。

但是本质问题还是没解决,不可能以后开发也用这样的方法,用多了也烦躁。所以解决这个问题的关键在于了解Activity的加载模式。

第一中加载模式是:standard标准模式,系统默认的加载的模式

android:launchMode=“standard”

这种模式是系统的默认模式,一般开发app不需要更改。只要不安手机上的物理按键返回键back键。

这种加载模式的原理是开启app第一个界面时,为app创建一个Task来管理app的开启的Activity,每次操作都会创建一个新的实例Activty,同时也包括返回。所以如果你按手机上的物理按键back键后,会依次返回你之前的操作,知道app的第一个实例化得Activty。如果在app中操作太多,创建的Activity实例也会变得很多,如果大量操作的话,会出现卡顿的现象,也有可能出现内存溢出导致手机应用程序挂掉。

第二种加载模式是:singleTop模式

这种模式与standard标准模式相似,但不同的是这种模式如果开启的Activty位于栈顶的话,就不会重新实例化Activty,不管操作多少次都不会改变界面上的程序体验。

如果在任务栈顶没有要开启的Activty的话,就会创建新的Actvity加载到栈顶——此时与与standard标准模式完全相同。

第三种加载模式是:singleTask模式

这种加载模式在一个任务栈Task中只有一个Activty,不会重复地创建任务栈里有的Activty实例的。这种模式有三类情况

(1)如果将要启动的目标Activity没有在任务栈中且不位于栈顶的话,就会重新实例化Activty加载到栈顶。

(2)如果将要启动的目标Activity位于栈顶的话,此时与singleTop模式加载模式一样

(3)如果将要启动的目标Activity存在任务栈,但是又不在栈顶的话,系统会将任务栈内处于目标以上的所有Activty都一处,直到目标Activty暴露在栈顶。

第四种加载模式;singleInstance模式:

在这种加载模式下,不管目标Activity位于哪个Task任务栈,只会创建一个实例Activity。这种模式分为俩种情况:

(1)如果将要启动的目标Activty不存在,系统会创建一个全新的任务栈Activty再创建目标Activty实例,并将其加入栈顶。

(2)如果将要启动的实例Activity存在,无论它位于哪个应用程序中,位于哪个任务栈Task,系统都会将目标实例Activity转到前台,就是栈顶,从而使该目标Activity显示出来

注意:采用singleInstance模式加载Activity总是位于栈顶,且采用singleInstance模式加载的Activity所在Task将只包含该Activity

回到之前的所说的问题,屏蔽物理按键显然不是个好方法。所以折中的办法是将Activity的加载模式稍微改一下。将加载模式标准的standard模式改为singleTask模式,此时前面的问题迎刃而解。物理按键和app返回操作都有效,而且也不会出现大量操作卡顿的现象。看似问题解决了,但是有一个问题就来了,也就是标题的问题,使用带返回值的intent操作不管怎么弄返回的数据都为空,而且app会出现典型的问题应用程序无响应。

通过Android的Activity加载模式可以看到,singleTask模式加载Activity实例,当任务栈的目标Activity实例不在栈顶时,系统会移除目标上面的所有Activity实例,从而是目标转为前台,但是之前的栈顶的要返回的Activity以及不存在了,返回到第一张界面找不到第二张界面返回的数据,所以返回数据为空,而且onActivityResult()中的数据捕获异常,导致程序挂掉,至此问题找到了,所以可以把第二张界面的加载模式设为singleTop模式。至此,问题解决了。但是,仔细想一下,如果再次按返回键的话,应该也会将第二张界面重复地实例化多次,不过按返回键不会出现标准模式下的操作返回模式。只不过第二张界面在应用程序不退出的情况下,仍然会重复地新建第二张界面,不过不会影响返回键操作。所以这点小小瑕疵还是能够允许的。到此为止,一路上的问题都解决了。

时间: 2024-10-01 05:11:03

android onActivityResult()接收返回数据为null的解决方案的相关文章

C#串口通信—向串口发送数据,同步接收返回数据

最近写C#串口通信程序,系统是B/S架构.SerialPort类有一个DataReceived事件,用来接收串口返回的数据,但这种方式在C/S架构下很好用,但B/S就不好处理了.所以写了一个同步模式接收返回数据的方法,不使用DataReceived事件.经过测试,可以正常使用(不支持多线程调用). 一.Machine类 1.Machine类有一个静态变量,定义如下: private static SerialPort serialPort = null; 2.向串口发送数据,同步接收返回数据的方

Android学习-调用onActivityResult()接收返回来的信息

1.在调用另外一个activity时是为了得到返回来的值时,若选择通讯录时候进入通讯录只是返回一个电话号码等等,我们可以调用startActivityForResult(); Intent intent=new Intent(); intent.setAction("com.example.multiactivity.SecondActivity3"); intent.addCategory("android.intent.category.DEFAULT"); B

后台返回数据事null时怎么进行判断

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545; min-height: 14.0px } span.s1 { font: 12.0px ".PingFang

android AsynTask处理返回数据和AsynTask使用get,post请求

Android是一个单线程模型,Android界面(UI)的绘制都只能在主线程中进行,如果在主线程中进行耗时的操作,就会影响UI的绘制和事件的响应.所以在android规定,不可在主线中进行耗时操作,否则将发生程序无响应(ANR)问题. 解决办法:开启新的线程进行耗时操作 开启新的线程可以new Thread()  或实现Runnable接口 什么要使用AsyncTask呢? 如果是使用Thread的run()方法,run()结束之后没有返回值.所以必须要自己建立通信机制 AsyncTask将所

Android onActivityResult获取返回值的用法

2014-03-09 00:08:15 分类: Android平台 现有MainActivity,当它进入到SecondActivity后,在SecondActivity中进行了某些操作然后需要将值返回给MainActivity时, 于是就可以用到onActivityResult() 这个方法了,下面呢,我就具体来介绍一下用法. 不过在这之前,先讲一下intent的用法: 对于intent主要的分类主要包括隐式意图和显式意图.显式意图通常主要是启动本应用中的Activity之间的数据, 而隐式意

android发送/接收json数据(转)

客户端向服务器端发送数据,这里用到了两种,一种是在url中带参数,一种是json数据发送方式: url带参数的写法: url+/?r=m/calendar/contact_list&uid=3&&subscriptionslist[pageindex]=10&subscriptionslist[recordlimit]=10 从“&”符号之后一连串都是参数. 发送方式代码编写" DefaultHttpClient httpClient = new Defa

Ajax 直接发送 PUT 请求,后端无法接收到数据的原因及解决方案

一.问题描述: 使用 Ajax 直接发送 PUT 请求,但 Spring MVC 封装的对象中,除过 URI 中带有的 id 字段被成功封装,请求体中的数据没有被封装到对象中. 通过测试,前端传来的请求体中有数据:通过 HttpServletRequest 对象,使用 request.getParameter() 方法却也获取不到数据 二.解决方案: 在 web.xml 中添加 HttpPutFormContentFilter 过滤器,原理向下看: 1 <filter> 2 <filte

Android页面之间进行数据回传

Android页面之间进行数据回传 要求:页面1跳转到页面2,页面2再返回页面1同时返回数据 页面1添加如下代码: Intent intent = new Intent(); intent.setClass(页面1.this, 页面2.class); Bundle bundle = new Bundle(); intent.putExtras(bundle);//将Bundle添加到Intent,也可以在Bundle中添加相应数据传递给下个页面,例如:bundle.putString("abc&

Android调用系统相机获取返回数据

由于项目需要调用相机,实现上传照片,例如微博,微信中功能.Android中可以非常轻松的调用系统相机,并返回Bitmap数据,但有一点不足,它返回的Bitmap尺寸很小,清晰度不够,这问题将稍后解决.下面通过代码演示. 1.界面布局 res/layout 定义一个简单布局,一个Button和ImageView,分别用于跳转系统相机Activity和显示系统相机返回数据. 1 <LinearLayout xmlns:android="http://schemas.android.com/ap