android 回退 activity,Android Activity要点(2)
一、带返回值的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)相关推荐
- android 回退函数,android浏览器研究-回退和前进
浏览器探究--回退和前进 前进: 在菜单中点击前进功能主线程会执行BrowserActivity.onOptionsItemSelected,它会调用Controller.onOptionsItemS ...
- Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复
Android中的状态保存和恢复 Android中的状态保存和恢复, 包括Activity和Fragment以及其中View的状态处理. Activity的状态除了其中的View和Fragment的状 ...
- android service交互,Android Activity与Service的交互方式
参考: http://blog.csdn.net/gebitan505/article/details/18151203 实现更新下载进度的功能 1. 通过广播交互 Server端将目前的下载进度,通 ...
- Android学习之管理Activity的生命周期
Activity生命周期 activity第一次启动的时候,它来到系统的前台,开始与用户交互.在此期间,Android系统调用了Activity生命周期中一系列的方法.如果用户执行启动了另一个acti ...
- android studio实验二 Activity及常用布局和控件的使用
实验内容 1.创建一个Android应用,创建一个Android应用,创建MainActivity和LoginActivity. 2.在MainActivity中的onCreate,onStart,o ...
- Android第一行代码-Activity
文章目录 Android第一行代码 Activity 1.Activity基本用法 2.创建和加载布局 加载布局(在Activity中加载布局) 在AndroidManifest文件中注册(所有的ac ...
- Android全面解析之Activity生命周期
前言 很高兴遇见你~ 欢迎阅读我的文章. 关于Activity生命周期的文章,网络上真的很多,有很多的博客也都讲得相当不错,可见Activity的重要性是非常高的.事实上,我猜测每个android开发 ...
- 深入剖析Android四大组件(九)——Activity之AppCompatActivity与toolbar的结合
对于技术类的博客,我们永远追寻最新API脚步,在API22之前我们使用标题栏基本都是在ActionBarActivity的Activity中处理的,而API22之后,谷歌遗弃了ActionBarAct ...
- android自定义view获取控件,android 自定义控件View在Activity中使用findByViewId得到结果为null...
转载:http://blog.csdn.net/xiabing082/article/details/48781489 1. 大家常常自定义view,,然后在xml 中添加该view 组件..如果在 ...
最新文章
- 几种xml读取方法比较
- php start,php start.php start 报错
- Scala集合:reduce(化简)方法使用示例
- ZOJ 1057 Undercut(简单模拟)
- Android_自适应布局
- java json配置文件_java 读取json文件配置
- web漏洞扫描器-appscan
- smart3d加载到谷歌_Android Google Smart Lock
- WordPress插件大合集会员收费下载/美化/卡密批量生成/积分功能 ErphpDown 包含9.42~~9.83版本
- 后缀是lnk是什么文件_ink是什么文件
- Apple Sign in with Apple(苹果授权登录PHP)
- cacheable 表达式_Spring Boot缓存注解@Cacheable、@CacheEvict、@CachePut使用
- 软件著作权的鉴定材料提交
- 无法打开msdn主页以及与微软相关的其他主页,但能打开其他网页
- WIN32 2048游戏
- python get score gain_机器学习的特征重要性究竟是怎么算的
- 机器学习SVM--基于手写字体识别
- XCTF_MOBILE15_人民的名义-抓捕赵德汉1-200
- Java数据结构与算法——链表
- 在武汉,想和你一起做的100件事
热门文章
- 2020癌症大数据分析,哪些癌症最要命?
- opencv 图像旋转_用Dlib和OpenCV还能做什么?这个开源项目实现了驾驶员疲劳检测...
- android按钮进度动画,android – 在按钮后面放置一个进度条
- python面向接口编程_Python 中的面向接口编程
- Python推荐算法讲解
- 5道Python函数练习
- python中的变量与对象
- VS cmake远程调试ubuntu项目生成报错:“Does not match the generator used previously: Ninja“(删除.vs隐藏文件夹)
- 【B站视频笔记】linux 进程间通信(ipc)信号(软中断信号)signal库函数、可靠信号和不可靠信号、信号集sigprocmask(信号掩码、信号递达Delivery、信号未决Pending)
- Linux 用户空间和内核空间指的是什么?