Android教程 -04 启动其它Activity,静态工厂设计模式传递数据
2015-10-16 13:43
681 查看
视频建议采用超清模式观看, 欢迎点击订阅我的优酷
学习开启其它的Activity,首先需要了解意图:
Intent是在不同组件中(比如两个Activity)提供运行时绑定的对象。Intent代表一个应用”想去做什么事”,你可以用它做各种各样的任务,不过大部分的时候他们被用来启动另一个Activity。
显示意图顾名思义, 其实就是把要开启的Activity的名字赤裸裸的写在代码中。
如下面代码就是要启动Demo2Activity,当然肯定需要上下文(Context)这个上帝类。需要注意的是要启动的activity必须要在清单文件(AndroidManifest.xml)中进行配置。
显示意图启动Activity的速度略快,不过有些局限性,只能开启自己程序中的Activity
相对于显示意图更加含蓄
需要指定当前Activity 能够响应的action或category。
每个Activity要想能被开启都需要在清单文件(AndroidManifest.xml)中进行配置,当配置完成,程序部署到手机的时候,该Activity会加入到系统的列表中。在配置的时候,我们可以对activity进行一些描述(添加action或category),另一个Activity通过这些描述就可以开启这个Activity。
参考下图:
代码如下
隐式意图不仅可以开启自己程序的Activity,还可以开启其它程序的Activity,一般的原则是开启自己程序的Activity多用显示意图。
需要注意的是,如果想让你的程序具备分享其他程序文本的功能,需要在你想要分享的Activity添加如下配置:
这样我们程序的MainActivity就具备分享文本的功能了。
Activity之间传递数据是很常见的操作,传递数据核心的方法就是通过Intent的putExtra方法传递,可以传递的类型包括八大基本类型,字符串和实现Serializable或Parcelable接口的对象,也可以传递ArrayList集合(集合里对类型有约束,允许的类型包括String,Parcelable)。
写法和用map集合添加数据一样, 需要用到key-value键值对。
我们以SendDataActivity和RDataActivity为例演示一下代码:
下面是RDataActivity接受数据:
需要注意的是两个Activity的key(就是代码中”key”) 必须保持一致。但是这种写法有个潜在的问题。
在实际开发的过程中,往往同时有多个程序员写不同的Activity。经常会出现传递数据的Activity和接受数据的Activity不是一个程序员写的。为了保持key统一,就需要两个程序员之间进行沟通,这样大大提高了程序的耦合性,程序变的不那么容易维护。
安卓中的基本问题之一就是对键/值对的持有。因为bundle 需要键/值对,所以你总是需要一个key。然而问题是哪里保存这些key?
与其创建另一个类的对象,不如让对应的类自己创建对象。
我们接下来修改一下RDataActivity的代码,添加一个静态方法,其余不用变。让RDataActivity自己创建自己的Intent
调用者类无需知道intent以及key的任何事情。SendDataActivity只需告诉RDataActivity,”嘿,我需要一个带有这个数据的intent”。就是这样,RDataActivity会做完其它的事情。我们接下来修改下SendDataActivity的sendData方法
这样改完以后代码就变的容易维护了。
这时候就用到两个核心的方法:
1. startActivityForResult()
2. onActivityResult()
开启Activity要用startActivityForResult了,我们继续把上面的代码改造下:
RDataActivity添加代码:
当RDataActivity退出的时候就会调用SendDataActivity的onActivityResult()方法
意图 Intent
一个应用程序肯定不只有一个界面,如何切换到其它界面,只时候就需要启动其它的Activity。启动Activity有多种方式。我在这简单总结下:学习开启其它的Activity,首先需要了解意图:
Intent是在不同组件中(比如两个Activity)提供运行时绑定的对象。Intent代表一个应用”想去做什么事”,你可以用它做各种各样的任务,不过大部分的时候他们被用来启动另一个Activity。
显示意图
显示意图顾名思义, 其实就是把要开启的Activity的名字赤裸裸的写在代码中。
如下面代码就是要启动Demo2Activity,当然肯定需要上下文(Context)这个上帝类。需要注意的是要启动的activity必须要在清单文件(AndroidManifest.xml)中进行配置。
// 初始化Button控件 button= (Button) findViewById(R.id.button); // 设置button的点击事件 button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 声明Button的点击事件 跳转到Demo2Activity // 参数1 上下文 参数2 跳转Activity的字节码 Intent intent = new Intent(getApplicationContext(), Demo2Activity.class); startActivity(intent); } });
显示意图启动Activity的速度略快,不过有些局限性,只能开启自己程序中的Activity
隐式意图
视频建议采用超清模式观看, 欢迎点击订阅我的优酷相对于显示意图更加含蓄
需要指定当前Activity 能够响应的action或category。
每个Activity要想能被开启都需要在清单文件(AndroidManifest.xml)中进行配置,当配置完成,程序部署到手机的时候,该Activity会加入到系统的列表中。在配置的时候,我们可以对activity进行一些描述(添加action或category),另一个Activity通过这些描述就可以开启这个Activity。
参考下图:
代码如下
<!--在清单文件中描述Demo2Activity--> <activity android:name=".Demo2Activity" android:label="@string/title_activity_demo2" > <intent-filter> <action android:name="aaa.bbb.ccc" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
// 初始化Button控件 button = (Button) findViewById(R.id.button); // 设置button的点击事件 button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //通过隐式意图开启activity Intent intent = new Intent(); intent.setAction("aaa.bbb.ccc"); intent.addCategory("android.intent.category.DEFAULT"); startActivity(intent); } });
隐式意图不仅可以开启自己程序的Activity,还可以开启其它程序的Activity,一般的原则是开启自己程序的Activity多用显示意图。
隐式意图的常见操作
视频建议采用超清模式观看, 欢迎点击订阅我的优酷拨打电话
/** * 拨打电话 */ public void dail(View v){ Intent intent=new Intent(); intent.setAction(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:1333333333")); startActivity(intent); }
打开浏览器
/** * 打开浏览器 */ public void goToBrowser(View v){ Intent intent=new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.baidu.com")); startActivity(intent); }
分享文本
/** * 分享 */ public void share(View v){ Intent intent=new Intent(); intent.setAction(Intent.ACTION_SEND); // 指定参数的类型 intent.setType("text/plain"); // "image/png" // 设置要分享的文本 intent.putExtra(Intent.EXTRA_TEXT,"于连林很帅"); startActivity(intent); }
需要注意的是,如果想让你的程序具备分享其他程序文本的功能,需要在你想要分享的Activity添加如下配置:
<activity android:name=".MainActivity" > <intent-filter> <action android:name="android.intent.action.SEND" /> <data android:mimeType="text/plain" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
这样我们程序的MainActivity就具备分享文本的功能了。
Activity之间传递数据
视频建议采用超清模式观看, 欢迎点击订阅我的优酷Activity之间传递数据是很常见的操作,传递数据核心的方法就是通过Intent的putExtra方法传递,可以传递的类型包括八大基本类型,字符串和实现Serializable或Parcelable接口的对象,也可以传递ArrayList集合(集合里对类型有约束,允许的类型包括String,Parcelable)。
写法和用map集合添加数据一样, 需要用到key-value键值对。
我们以SendDataActivity和RDataActivity为例演示一下代码:
// SendDataActivity传递数据给RDataActivity public void sendData(View v){ Intent intent=new Intent(this,RDataActivity.class); intent.putExtra("key","要传递的数据"); // 打开Activity startActivity(intent); }
下面是RDataActivity接受数据:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_rdata); // 获取到开启当前Activity的意图 Intent intent =getIntent(); // Value就是我们接受的数据 String value=intent.getStringExtra("key"); //... }
需要注意的是两个Activity的key(就是代码中”key”) 必须保持一致。但是这种写法有个潜在的问题。
静态工厂设计模式传递数据
视频建议采用超清模式观看, 欢迎点击订阅我的优酷在实际开发的过程中,往往同时有多个程序员写不同的Activity。经常会出现传递数据的Activity和接受数据的Activity不是一个程序员写的。为了保持key统一,就需要两个程序员之间进行沟通,这样大大提高了程序的耦合性,程序变的不那么容易维护。
安卓中的基本问题之一就是对键/值对的持有。因为bundle 需要键/值对,所以你总是需要一个key。然而问题是哪里保存这些key?
与其创建另一个类的对象,不如让对应的类自己创建对象。
我们接下来修改一下RDataActivity的代码,添加一个静态方法,其余不用变。让RDataActivity自己创建自己的Intent
public static Intent newIntent(Context context,String value){ Intent intent=new Intent(context,RDataActivity.class); intent.putExtra("key",value); return intent; }
调用者类无需知道intent以及key的任何事情。SendDataActivity只需告诉RDataActivity,”嘿,我需要一个带有这个数据的intent”。就是这样,RDataActivity会做完其它的事情。我们接下来修改下SendDataActivity的sendData方法
public void sendData(View v){ Intent intent=RDataActivity.newIntent(this,"value"); startActivity(intent); // 开启RDataActivity }
这样改完以后代码就变的容易维护了。
返回数据给之前的Activity
视频建议采用超清模式观看, 欢迎点击订阅我的优酷这时候就用到两个核心的方法:
1. startActivityForResult()
2. onActivityResult()
开启Activity要用startActivityForResult了,我们继续把上面的代码改造下:
// SendDataActivity传递数据给RDataActivity public void sendData(View v){ Intent intent=RDataActivity.newIntent(this,"value"); // 修改开启Activity的方法 startActivityForResult(intent,0); //参数2是 requestCode请求码 }
RDataActivity添加代码:
// 退出按钮点击事件, 点击退出 public void exit(View v){ Intent intent=new Intent(); intent.putExtra("result","resultData"); //回传的数据 setResult(0, intent); //参数1: resultCode 结果码 finish(); // 主动关闭当前Activity }
当RDataActivity退出的时候就会调用SendDataActivity的onActivityResult()方法
@Override // requestCode 请求码 resultCode结果码 data传递的数据 protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(resultCode==0&&data!=null){ String result=data.getStringExtra("result"); Toast.makeText(this,result,Toast.LENGTH_LONG).show(); } }
相关文章推荐
- Android教程 -04 启动其它Activity,静态工厂设计模式传递数据
- Android Studio+Genymotion
- Android AudioSystem模块分析
- android安全学习之2—android中.pem和.pk8是什么文件?
- Android插件开发框架
- Android 分享功能实现与 QQ 纯文本分享
- Using smem on Android
- Android memory usage
- 关于Android的.so文件你所需要知道的
- Android应用程序之数据存储(一)
- Android开发:获取屏幕宽和高的两种方法(px、dip、分辨率之间的关系及px与dip互相转化)
- 优秀的开源框架学习
- Android源码Luncher2调试环境的搭建
- 关于Android Studio 编译时电脑假死的解决方案
- Android内存优化:ArrayMap
- 布局中自定义属性使用模板
- Android应用程序相关目录
- 新东西012--Android软键盘弹出位置控制
- Android休眠设置时间
- android安全学习之1—什么是数字签名、数字证书