视频建议采用超清模式观看, 欢迎点击订阅我的优酷

意图 Intent

一个应用程序肯定不只有一个界面,如何切换到其它界面,只时候就需要启动其它的Activity。启动Activity有多种方式。我在这简单总结下:

学习开启其它的Activity,首先需要了解意图:

Intent是在不同组件中(比如两个Activity)提供运行时绑定的对象。Intent代表一个应用”想去做什么事”,你可以用它做各种各样的任务,不过大部分的时候他们被用来启动另一个Activity。

显示意图

显示意图顾名思义, 其实就是把要开启的Activity的名字赤裸裸的写在代码中。

如下面代码就是要启动Demo2Activity,当然肯定需要上下文(Context)这个上帝类。需要注意的是要启动的activity必须要在清单文件(AndroidManifest.xml)中进行配置。

  1. // 初始化Button控件
  2. button= (Button) findViewById(R.id.button);
  3. // 设置button的点击事件
  4. button.setOnClickListener(new View.OnClickListener() {
  5. @Override
  6. public void onClick(View v) {
  7. // 声明Button的点击事件 跳转到Demo2Activity
  8. // 参数1 上下文 参数2 跳转Activity的字节码
  9. Intent intent = new Intent(getApplicationContext(), Demo2Activity.class);
  10. startActivity(intent);
  11. }
  12. });

显示意图启动Activity的速度略快,不过有些局限性,只能开启自己程序中的Activity

隐式意图

视频建议采用超清模式观看, 欢迎点击订阅我的优酷

  1. 相对于显示意图更加含蓄
  2. 需要指定当前Activity 能够响应的action或category。

每个Activity要想能被开启都需要在清单文件(AndroidManifest.xml)中进行配置,当配置完成,程序部署到手机的时候,该Activity会加入到系统的列表中。在配置的时候,我们可以对activity进行一些描述(添加action或category),另一个Activity通过这些描述就可以开启这个Activity。

参考下图:

代码如下

  1. <!--在清单文件中描述Demo2Activity-->
  2. <activity
  3. android:name=".Demo2Activity"
  4. android:label="@string/title_activity_demo2" >
  5. <intent-filter>
  6. <action android:name="aaa.bbb.ccc" />
  7. <category android:name="android.intent.category.DEFAULT" />
  8. </intent-filter>
  9. </activity>
  1. // 初始化Button控件
  2. button = (Button) findViewById(R.id.button);
  3. // 设置button的点击事件
  4. button.setOnClickListener(new View.OnClickListener() {
  5. @Override
  6. public void onClick(View v) {
  7. //通过隐式意图开启activity
  8. Intent intent = new Intent();
  9. intent.setAction("aaa.bbb.ccc");
  10. intent.addCategory("android.intent.category.DEFAULT");
  11. startActivity(intent);
  12. }
  13. });

隐式意图不仅可以开启自己程序的Activity,还可以开启其它程序的Activity,一般的原则是开启自己程序的Activity多用显示意图。

隐式意图的常见操作

视频建议采用超清模式观看, 欢迎点击订阅我的优酷

拨打电话

  1. /**
  2. * 拨打电话
  3. */
  4. public void dail(View v){
  5. Intent intent=new Intent();
  6. intent.setAction(Intent.ACTION_CALL);
  7. intent.setData(Uri.parse("tel:1333333333"));
  8. startActivity(intent);
  9. }

打开浏览器

  1. /**
  2. * 打开浏览器
  3. */
  4. public void goToBrowser(View v){
  5. Intent intent=new Intent();
  6. intent.setAction(Intent.ACTION_VIEW);
  7. intent.setData(Uri.parse("http://www.baidu.com"));
  8. startActivity(intent);
  9. }

分享文本

  1. /**
  2. * 分享
  3. */
  4. public void share(View v){
  5. Intent intent=new Intent();
  6. intent.setAction(Intent.ACTION_SEND);
  7. // 指定参数的类型
  8. intent.setType("text/plain"); // "image/png"
  9. // 设置要分享的文本
  10. intent.putExtra(Intent.EXTRA_TEXT,"于连林很帅");
  11. startActivity(intent);
  12. }

需要注意的是,如果想让你的程序具备分享其他程序文本的功能,需要在你想要分享的Activity添加如下配置:

  1. <activity
  2. android:name=".MainActivity"
  3. >
  4. <intent-filter>
  5. <action android:name="android.intent.action.SEND" />
  6. <data android:mimeType="text/plain" />
  7. <category android:name="android.intent.category.DEFAULT" />
  8. </intent-filter>
  9. </activity>

这样我们程序的MainActivity就具备分享文本的功能了。

Activity之间传递数据

视频建议采用超清模式观看, 欢迎点击订阅我的优酷

Activity之间传递数据是很常见的操作,传递数据核心的方法就是通过Intent的putExtra方法传递,可以传递的类型包括八大基本类型,字符串和实现Serializable或Parcelable接口的对象,也可以传递ArrayList集合(集合里对类型有约束,允许的类型包括String,Parcelable)。

写法和用map集合添加数据一样, 需要用到key-value键值对。

我们以SendDataActivity和RDataActivity为例演示一下代码:

  1. // SendDataActivity传递数据给RDataActivity
  2. public void sendData(View v){
  3. Intent intent=new Intent(this,RDataActivity.class);
  4. intent.putExtra("key","要传递的数据");
  5. // 打开Activity
  6. startActivity(intent);
  7. }

下面是RDataActivity接受数据:

  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3. super.onCreate(savedInstanceState);
  4. setContentView(R.layout.activity_rdata);
  5. // 获取到开启当前Activity的意图
  6. Intent intent =getIntent();
  7. // Value就是我们接受的数据
  8. String value=intent.getStringExtra("key");
  9. //...
  10. }

需要注意的是两个Activity的key(就是代码中”key”) 必须保持一致。但是这种写法有个潜在的问题。

静态工厂设计模式传递数据

视频建议采用超清模式观看, 欢迎点击订阅我的优酷

在实际开发的过程中,往往同时有多个程序员写不同的Activity。经常会出现传递数据的Activity和接受数据的Activity不是一个程序员写的。为了保持key统一,就需要两个程序员之间进行沟通,这样大大提高了程序的耦合性,程序变的不那么容易维护。

安卓中的基本问题之一就是对键/值对的持有。因为bundle 需要键/值对,所以你总是需要一个key。然而问题是哪里保存这些key?

与其创建另一个类的对象,不如让对应的类自己创建对象。

我们接下来修改一下RDataActivity的代码,添加一个静态方法,其余不用变。让RDataActivity自己创建自己的Intent

  1. public static Intent newIntent(Context context,String value){
  2. Intent intent=new Intent(context,RDataActivity.class);
  3. intent.putExtra("key",value);
  4. return intent;
  5. }

调用者类无需知道intent以及key的任何事情。SendDataActivity只需告诉RDataActivity,”嘿,我需要一个带有这个数据的intent”。就是这样,RDataActivity会做完其它的事情。我们接下来修改下SendDataActivity的sendData方法

  1. public void sendData(View v){
  2. Intent intent=RDataActivity.newIntent(this,"value");
  3. startActivity(intent); // 开启RDataActivity
  4. }

这样改完以后代码就变的容易维护了。

返回数据给之前的Activity

视频建议采用超清模式观看, 欢迎点击订阅我的优酷

这时候就用到两个核心的方法:

1. startActivityForResult()

2. onActivityResult()

开启Activity要用startActivityForResult了,我们继续把上面的代码改造下:

  1. // SendDataActivity传递数据给RDataActivity
  2. public void sendData(View v){
  3. Intent intent=RDataActivity.newIntent(this,"value");
  4. // 修改开启Activity的方法
  5. startActivityForResult(intent,0); //参数2是 requestCode请求码
  6. }

RDataActivity添加代码:

  1. // 退出按钮点击事件, 点击退出
  2. public void exit(View v){
  3. Intent intent=new Intent();
  4. intent.putExtra("result","resultData"); //回传的数据
  5. setResult(0, intent); //参数1: resultCode 结果码
  6. finish(); // 主动关闭当前Activity
  7. }

当RDataActivity退出的时候就会调用SendDataActivity的onActivityResult()方法

  1. @Override
  2. // requestCode 请求码 resultCode结果码 data传递的数据
  3. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  4. super.onActivityResult(requestCode, resultCode, data);
  5. if(resultCode==0&&data!=null){
  6. String result=data.getStringExtra("result");
  7. Toast.makeText(this,result,Toast.LENGTH_LONG).show();
  8. }
  9. }

Android教程 -04 启动其它Activity,静态工厂设计模式传递数据的更多相关文章

  1. activity之间通过全局变量传递数据

    activity之间通过全局变量传递数据 一.简介 Application域中的onCreate方法是Android程序的入口,Android程序运行的时候就自动加载Application的对象,感觉 ...

  2. 设计模式--静态工厂设计模式在android中的使用

    今天看到这篇文章:http://www.androiddesignpatterns.com/2012/05/using-newinstance-to-instantiate.html public c ...

  3. [Android] Activity间切换,传递数据

    前面照着android系统的裁剪图片的功能自己写了一个相似的工具.功能是大体上实现了,但留下了一个调用的问题:如何从我的程序调用这个裁剪工具,并且获得裁剪后的图片呢? 其实这个也很简单了,就是inte ...

  4. 【Android】7.0 Intent向下一个活动传递数据、返回数据给上一个活动

    1.0 可以利用Intent吧数据传递给上一个活动,新建一个叫“hellotest01”的项目. 新建活动FirstActivity,勾选“Generate Layout File”和“Launche ...

  5. Android学习笔记(十二)——使用意图传递数据的几种方式

    使用意图传递数据的几种方式 点此获取完整代码 我们除了要从活动返回数据,也经常要传递数据给活动.对此我们能够使用Intent对象将这些数据传递给目标活动. 1.创建一个名为PassingData的项目 ...

  6. activity与fragment之间传递数据

    总结:无论是activity给fragment传递数据,还是fragment给activity传递数据,都把activity和fragment都当做一个普通的对象,调用它的方法,传递参数. 1.Fra ...

  7. Android通过网页打开App到指定页面并传递数据

    首先在 Android Manifest 文件中注册 intent-filter <activity android:name=".MainActivity" android ...

  8. Android JNI 由C/C++本地代码向Java层传递数据

    最近做的Android项目需要调用C代码,进行串口通信及与硬件设备通信,因此要用到JNI,其中本地代码需要向Java层返回三个参数,分别为 参数一:int型: 参数二: 通信指令,本地代码中为unsi ...

  9. 【Android 复习】 : Activity之间传递数据的几种方式

    在Android开发中,我们通常需要在不同的Activity之间传递数据,下面我们就来总结一下在Activity之间数据传递的几种方式. 1. 使用Intent来传递数据 Intent表示意图,很多时 ...

随机推荐

  1. Spring Boot邮件功能

    1.应用场景 邮件功能的应用场景可谓十分广泛,诸如注册用户.密码找回,消息通知.以及一些程序异常通知等都需要使用到该功能. 正是由于邮件功能的使用广泛,因此springboot也加在它的组件中添加了邮 ...

  2. linux查看现在在运行的进程 $ pstree -a$ ps aux

    这都是查看现有进程的. ps aux 的结果比较杂乱 pstree -a 的结果比较简单明了,可以看到正在运行的进程及相关用户.

  3. bzoj 2705 [SDOI2012]Longge的问题——欧拉函数大水题

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2705 撕逼题.不就是枚举gcd==d,求和phi[ n/d ]么. 然后预处理sqrt (n ...

  4. 洛谷3128 [USACO15DEC]最大流Max Flow——树上差分

    题目:https://www.luogu.org/problemnew/show/P3128 树上差分.用离线lca,邻接表存好方便. #include<iostream> #includ ...

  5. 【BZOJ2809】【APIO2012】dispatching

    左偏树. 每个子节点维护大根堆,遍历一个儿子就往自己合并,合并发现钱不够了就删除队顶. //Achen #include<algorithm> #include<iostream&g ...

  6. 批处理启动应用程序(win)

    @echo off net session >nul 2>&1 " ( echo Oops: This tools must run with administrator ...

  7. (一)学习SpringBoot介绍

    为什么去要用到SpringBoot 特点: 创建独立的spring应用 嵌入tomcat ,jetty不需要部署 提供starters poms简化maven配置 尽可能自动配置spring'应用 提 ...

  8. 利用 awk 将当前的链接按端口汇总倒排序

    写了一行命令,利用 awk 将当前的链接按端口汇总倒排序  :) netstat -ano | awk /tcp.*:1[15].*:[1-5]/'{print $4}' | awk -F ':' ' ...

  9. Docker.[4].容器操作.

    Docker.[4].容器操作. 熟悉的指令: 启动容器 docker run 交互式启动容器 docker run -i -t IMAGENAME /bin/bash 停止容器 exit 停止容器 ...

  10. 加快liferay 7的启动速度

    在启动Liferay的过程中,你会发现在某个时刻,会特别慢,停留了很久,它是停在validate LPKGs,检验LPKG files是否被篡改,这个过程在开发的过程中十分令人头疼. 现在Lifera ...