一、带返回值的Activity回退过程

一般情况下,我们要从当前Activity跳转到另一个Activity,采用的方法是通过startActivity(Intent)来携带数据并实现跳转

有时候又需要跳转到的Activity能够在回退时返回处理结果给前一个Activity,这就要用到以下方法了public void startActivityForResult(Intent intent, int requestCode)

该方法同样是用于实现Activity的跳转,不过多了一个int类型的请求码requestCode

requestCode用于标示当Activity回退时,处理结果是从哪一个Activity传递来的,因为当前Activity有可能需要跳转到多个Activity

此外,Activity类还包含有以下方法protected void onActivityResult(int requestCode, int resultCode, Intent data)

requestCode即是请求码,resultCode用于标示数据处理结果,data用于携带数据

因此,我们可以用以下代码实现Activity的跳转private int REQUEST_CODE = 10;

Intent intent = new Intent(MainActivity.this, Main2Activity.class);

Bundle bundle = new Bundle();

bundle.putString("requestText", "啊哈");

intent.putExtras(bundle);

startActivityForResult(intent, REQUEST_CODE);

向Intent中传入需要传递给Main2Activity的数据

然后,在onActivityResult中处理Main2Activity回退后传递而来的数据处理结果,这里用Log来输出@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {        if (resultCode == RESULT_OK && requestCode == REQUEST_CODE) {

Bundle bundle = data.getExtras();

Log.e("MainActivity", bundle.getString("responseText"));

}        super.onActivityResult(requestCode, resultCode, data);

}

其中,需要判断requestCode是否与请求码相等

此外,查看源码可知,resultCode取值一般为以下三个,用来标示操作结果/** Standard activity result: operation canceled. */

//标示操作取消

public static final int RESULT_CANCELED    = 0;

/** Standard activity result: operation succeeded. */

//标示操作成功

public static final int RESULT_OK           = -1;

/** Start of user-defined activity results. */

public static final int RESULT_FIRST_USER   = 1;

以上都是在MainActivity中操作,此外还需要在Main2Activity中设置返回结果

先取出传递而来的数据requestTextprivate String requestText;    @Override

protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main2);

Intent intent = getIntent();        if (intent != null) {

Bundle bundle = intent.getExtras();            if (bundle != null) {

requestText = bundle.getString("requestText");

}

}

init();

}

通过setResult方法设置处理结果为RESULT_OK,并通过intent携带处理结果public void init() {

findViewById(R.id.response).setOnClickListener(new View.OnClickListener() {            @Override

public void onClick(View v) {

Intent intent = new Intent();

Bundle bundle = new Bundle();

bundle.putString("responseText", "收到第一个Activity的请求内容为:" + requestText);

intent.putExtras(bundle);

setResult(RESULT_OK, intent);

finish();

}

});

}

这样就可以实现当Activity回退时,携带处理结果到前一个Activity了

二、关于Activity启动模式的补充说明

在上一篇博文中已经介绍过Activity的四种启动模式了,这里再来补充一些内容singleTask

此为栈内复用模式

如果以在AndroidManifest中声明属性的方式来设定启动模式的话,如果不指定taskAffinity属性,该Acitvity只会存在于当前栈中

想要让Activity以单实例的方式存在于一个新的栈的话,可以这样声明:

android:name=".Main2Activity"

android:launchMode="singleTask"

android:taskAffinity="com.custom.czy" />

注意,taskAffinity的值不能与包名相同,不然就相当于没有设置了

可以通过getTaskId()方法来查看当前Activity位于哪个栈,如:@Override

protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Log.e("第一个Activity", getTaskId() + "");

}singleInstance

即单实例模式

采用此种模式的Activity均会独立存在于一个栈内,即使两个Activity的taskAffinity属性相同

例如

android:name=".Main2Activity"

android:launchMode="singleInstance"

android:taskAffinity="com.custom.czy" />

android:name=".Main3Activity"

android:launchMode="singleInstance"

android:taskAffinity="com.custom.czy" />

Main2Activity和Main3Activity均声明为singleInstance模式且栈名为com.custom.czy

但通过Log.e("Activity", getTaskId() + "");查看,还是可以发现两个Activity存在于不同的栈中

三、Activity的隐式调用

隐式调用不需要明确指定要调用的Activity信息,而是根据Intent具有的信息去匹配目标组件的IntentFilter中所设置的过滤信息,如果匹配成功则启动,否则会报错

一个Activity可以包含有多个IntentFilter,只要Intent能够匹配其中一组< intent-filter >即可启动该Activity

IntentFilter具有的属性有:action、category、dataaction

action属性值是一个字符串,系统也为我们提供了多个action,如Intent.ACTION_VIEW可用于打开系统自带的浏览器

在 < intent-filter >中可以声明多个action,只要求Intent中携带的action字符串与其中一个相同即成功匹配该Activity

Intent中必须含有action属性,否则将直接匹配失败

public void startActivity(View view) {

Intent intent = new Intent("com.bb.hh");

intent.setAction("com.czy.action");

Log.e("++++++", intent.getAction());

startActivity(intent);

}

这样依然可以成功启动Activitycategory

在< intent-filter >中同样可以设定多个category属性,且Intent也可以通过addCategory(String category)添加多个category

与action属性不同的是,只要是在Intent中包含的category值,< intent-filter >都必须有category与之一一匹配,否则匹配失败

需要注意的是,系统在startActivity(Intent intent)的时候,会自动为Intent添加一个默认的category值,即:android.intent.category.DEFAULT

所以为了让Activity可以通过隐式调用的方式启动,需要在< intent-filter >同样为之添加一个默认的category值

如上述代码所示data

data属性用于指定当前活动能够响应什么类型的数据

如系统自带的浏览器自然就能响应http模式的网络连接要求,因此我们可以用隐式调用的方式来调用浏览器打开指定网页Intent intent = new Intent(Intent.ACTION_VIEW);

intent.setData(Uri.parse("http://www.baidu.com"));

startActivity(intent);

如果过滤规则中设置了data属性,则Intent中也必须含有data属性且相同才能匹配成功

data包含的属性值有:

android:host="string"

android:port="string"

android:path="string"

android:pathPattern="string"

android:pathPrefix="string"

android:mimeType="string"/>

data由两部分组成,mimeType和URI

mimeType指媒体类型,可以是:image/jpeg、video/*,用于表示图片、文本、视频等不同的媒体格式

URL的结构如下所示:

< scheme>://< host>:< port>/[< path>|< pathPrefix>|< pathPatten>]

scheme:URI的模式,如http,file,content,默认值为(content和file)

host:URI的主机名,比如www.baidu.com

port:URI的端口号

path、pathPatten和pathPrefix这三个参数表示路径信息

如,可以设置某Activity能够处理的数据类型为图片image

则可以通过设置mimeType属性来启动该Activitypublic void startActivity(View view) {

Intent intent = new Intent("com.bb.hh");

intent.setAction("com.czy.action");

intent.addCategory("android.intent.category.czy");

intent.setType("image/png");

startActivity(intent);

}

或者为Intent设置完整的data属性public void startActivity(View view) {

Intent intent = new Intent("com.bb.hh");

intent.setAction("com.czy.action");

intent.addCategory("android.intent.category.czy");

intent.setDataAndType(Uri.parse("file://abc"),"image/png");

startActivity(intent);

}

此外,由于通过隐式调用有可能因为匹配不成功而导致报错,所以在调用之前可以先判断当前是否有合适的ActivityIntent intent = new Intent("com.bb.hh");

intent.setAction("com.czy.action");

intent.addCategory("android.intent.category.czy");

intent.setDataAndType(Uri.parse("file://abc"), "image/png");

ComponentName componentName = intent.resolveActivity(getPackageManager());        if (componentName != null) {            String name = componentName.getClassName();

Log.e("MainActivity:", "匹配成功:" + name);

startActivity(intent);

} else {

Log.e("MainActivity:", "匹配失败");

}

如果匹配失败,resolveActivity方法就会返回null,否则就会返回匹配度最高的Activity信息

作者:leavesC

android 回退 activity,Android Activity要点(2)相关推荐

  1. android 回退函数,android浏览器研究-回退和前进

    浏览器探究--回退和前进 前进: 在菜单中点击前进功能主线程会执行BrowserActivity.onOptionsItemSelected,它会调用Controller.onOptionsItemS ...

  2. Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复

    Android中的状态保存和恢复 Android中的状态保存和恢复, 包括Activity和Fragment以及其中View的状态处理. Activity的状态除了其中的View和Fragment的状 ...

  3. android service交互,Android Activity与Service的交互方式

    参考: http://blog.csdn.net/gebitan505/article/details/18151203 实现更新下载进度的功能 1. 通过广播交互 Server端将目前的下载进度,通 ...

  4. Android学习之管理Activity的生命周期

    Activity生命周期 activity第一次启动的时候,它来到系统的前台,开始与用户交互.在此期间,Android系统调用了Activity生命周期中一系列的方法.如果用户执行启动了另一个acti ...

  5. android studio实验二 Activity及常用布局和控件的使用

    实验内容 1.创建一个Android应用,创建一个Android应用,创建MainActivity和LoginActivity. 2.在MainActivity中的onCreate,onStart,o ...

  6. Android第一行代码-Activity

    文章目录 Android第一行代码 Activity 1.Activity基本用法 2.创建和加载布局 加载布局(在Activity中加载布局) 在AndroidManifest文件中注册(所有的ac ...

  7. Android全面解析之Activity生命周期

    前言 很高兴遇见你~ 欢迎阅读我的文章. 关于Activity生命周期的文章,网络上真的很多,有很多的博客也都讲得相当不错,可见Activity的重要性是非常高的.事实上,我猜测每个android开发 ...

  8. 深入剖析Android四大组件(九)——Activity之AppCompatActivity与toolbar的结合

    对于技术类的博客,我们永远追寻最新API脚步,在API22之前我们使用标题栏基本都是在ActionBarActivity的Activity中处理的,而API22之后,谷歌遗弃了ActionBarAct ...

  9. android自定义view获取控件,android 自定义控件View在Activity中使用findByViewId得到结果为null...

    转载:http://blog.csdn.net/xiabing082/article/details/48781489 1.  大家常常自定义view,,然后在xml 中添加该view 组件..如果在 ...

最新文章

  1. 几种xml读取方法比较
  2. php start,php start.php start 报错
  3. Scala集合:reduce(化简)方法使用示例
  4. ZOJ 1057 Undercut(简单模拟)
  5. Android_自适应布局
  6. java json配置文件_java 读取json文件配置
  7. web漏洞扫描器-appscan
  8. smart3d加载到谷歌_Android Google Smart Lock
  9. WordPress插件大合集会员收费下载/美化/卡密批量生成/积分功能 ErphpDown 包含9.42~~9.83版本
  10. 后缀是lnk是什么文件_ink是什么文件
  11. Apple Sign in with Apple(苹果授权登录PHP)
  12. cacheable 表达式_Spring Boot缓存注解@Cacheable、@CacheEvict、@CachePut使用
  13. 软件著作权的鉴定材料提交
  14. 无法打开msdn主页以及与微软相关的其他主页,但能打开其他网页
  15. WIN32 2048游戏
  16. python get score gain_机器学习的特征重要性究竟是怎么算的
  17. 机器学习SVM--基于手写字体识别
  18. XCTF_MOBILE15_人民的名义-抓捕赵德汉1-200
  19. Java数据结构与算法——链表
  20. 在武汉,想和你一起做的100件事

热门文章

  1. 2020癌症大数据分析,哪些癌症最要命?
  2. opencv 图像旋转_用Dlib和OpenCV还能做什么?这个开源项目实现了驾驶员疲劳检测...
  3. android按钮进度动画,android – 在按钮后面放置一个进度条
  4. python面向接口编程_Python 中的面向接口编程
  5. Python推荐算法讲解
  6. 5道Python函数练习
  7. python中的变量与对象
  8. VS cmake远程调试ubuntu项目生成报错:“Does not match the generator used previously: Ninja“(删除.vs隐藏文件夹)
  9. 【B站视频笔记】linux 进程间通信(ipc)信号(软中断信号)signal库函数、可靠信号和不可靠信号、信号集sigprocmask(信号掩码、信号递达Delivery、信号未决Pending)
  10. Linux 用户空间和内核空间指的是什么?