Activity Intent IntentFilter

一理论概述

一. Activity

用来提供一个能让用户操作并与之交互的界面。

1.1 启动

startActivity(Intent intent):一般启动Activity
startActivityForResult(Intent intent,int requestCode):带回调启动Activity
onActivityResult(int reqCode,int resultCode,Intent data):回调方法
setResult(int resultCode,Intent data):设置要返回的结果
finish():结束当前Activity
getIntent():得到启动Activity的意图。

1.1.1 一般启动

  

1.1.2 带回调启动

1.2 生命周期

1.2.1 常见的生命周期方法

onCreate():表示Activity正在被创建,用于做一些初始化工作。------------------------------------------不可见,不可操作状态

onRestart():表示Activity正在被重新启动,当前Activity从不可见重新变成可见状态时。-----------不可见,不可操作状态

onStart():表示Activity正在被启动。这是Activity已经可见了,但还是没有出现在前台。------------可见,不可操作状态

onResume():表示Activity已经可见了,并且出现在前台并开始活动。-----------------------------------可见,可操作状态

onPause():表示Activity正在停止。--------------------------------------------------------------------------------可见,不可操作状态

onStop():表示Activity即将停止,可以做一些稍微重量级的回收工作,同样不能太耗时。-----------不可见,不可操作状态

onDestory():表示Activity即将被销毁,生命周期最后一个回调,在这里可以做一些回收工作和最终的资源释放。销毁状态

10-07 03:17:36.814 32088-32088/? D/panzqww: A ######### onCreate
10-07 03:17:36.815 32088-32088/? D/panzqww: A ######## onStart
10-07 03:17:36.816 32088-32088/? D/panzqww: A ########## onResume
10-07 03:18:02.810 32088-32088/com.example.panzq.simpleandroid_1 D/panzqww: A ############ onPause
10-07 03:18:02.924 32088-32088/com.example.panzq.simpleandroid_1 D/panzqww: B --- onCreate
B --- onStart
10-07 03:18:02.925 32088-32088/com.example.panzq.simpleandroid_1 D/panzqww: B --- onResume
10-07 03:18:03.389 32088-32088/com.example.panzq.simpleandroid_1 D/panzqww: A ######## onStop
10-07 03:18:08.776 32088-32088/com.example.panzq.simpleandroid_1 D/panzqww: B --- onPause
10-07 03:18:08.795 32088-32088/com.example.panzq.simpleandroid_1 D/panzqww: A ######### onRestart
10-07 03:18:08.796 32088-32088/com.example.panzq.simpleandroid_1 D/panzqww: A ######## onStart
A ########## onResume
10-07 03:18:09.172 32088-32088/com.example.panzq.simpleandroid_1 D/panzqww: B --- onStop
B --- onDestroy
10-07 03:18:12.209 32088-32088/com.example.panzq.simpleandroid_1 D/panzqww: A ############ onPause
10-07 03:18:12.608 32088-32088/com.example.panzq.simpleandroid_1 D/panzqww: A ######## onStop
A ######## onDestroy
  1. 启动Activity_a :a::onCreate -> a::onStart -> a::onResume
  2. 点击进入Activity_b : a:: onPause ->b::onCreate ->b::onStart ->b:: onResume ->a::onStop
  3. 按返回键返回到Activity_a : b::onpause -> a::onRestart -> a::onstart ->a::onResume -> b:: onstop -> b:onDestory
  4. 按返回键退出Activity_a:a::onPause -> a::onStop -> a::onDestory

1.2.2 异常情况下的生命周期

  onSaveInstanceState()

  onRestoreInstanceState()

  当资源相关的系统配置发生改变以及系统内存不足时,Activity就可能被杀死。只有当Activity被异常终止时,系统会调用onSaveInstanceState来保存当前Activity的状态。

这个方法的调用时机是在 onStop之前,它和onPause没有既定的时序关系,可能在onPause之前或者之后调用。当Activity被重新创建后,系统会调用onRestoreInstanceState,

并且把Activity销毁时onSaveInstanceState方法所保存的Bundle对象作为参数同时传递给onRestoreInstanceState和onCreate方法。因此我们可以通过onRestoreInstanceState

和onCreate方法来判断Activity是否被重建了。如果被重建了,那么我们就可以取出之前保存的数据并恢复,从时序上来说,onRestoreInstanceState的调用时机在onStart之后。

10-07 03:49:10.193 32704-32704/com.example.panzq.simpleandroid_1 D/panzqww: A ############ onPause
A --- onSaveInstanceState
10-07 03:49:10.197 32704-32704/com.example.panzq.simpleandroid_1 D/panzqww: A ######## onStop
A ######## onDestroy
10-07 03:49:10.215 32704-32704/com.example.panzq.simpleandroid_1 D/panzqww: A ######### onCreate
10-07 03:49:10.216 32704-32704/com.example.panzq.simpleandroid_1 D/panzqww: A ######## onStart
A --- onRestoreInstanceState
A ########## onResume

旋转屏幕

  1. a退出: a::onPause -> a:: onSaveInstanceState -> a:: onStop -> a::onDestroy
  2. a重新构造:a::onCreate -> a::onStart -> a::onRestoreInstanceState -> a::onResume

  当系统配置发生改变后,Activity会被重新创建,如果某项内容发生变化后,我们不想系统重新创建Activity,可以给Activity指定configChanges属性。

比如不想让Activity在屏幕旋转的时候重新创建,就可以给configChanges属性添加orientation这个值。

android:configChanges="orientation"

如果想指定多个值可以用“|”连接起来,比如一般屏幕方向发生变化时,屏幕尺寸也会发生变化,所以这两个同事使用才能不让屏幕旋转时调用系统重建。

android:configChanges="orientation|screenSize"

系统配置中所含的其他项目如下 :

项目 含义
mcc SIM卡唯一标识IMSI(国际移动用户标识码)中的国家代码,由三个数字组成,中国为460.此项标识mcc代码发生了改变
mnc SIM卡唯一标识IMSI(国际移动用户标识码)中的运营商代码,由两位数字组成,中国移动TD系统为00,中国联通为01,中国电信为03。此项标识mnc发生改变。
locale 设备的本地位置发生了改变,一般指切换了系统语言
touchscreen 触摸屏发生了改变,正常情况下无法发生改变,可以忽略此项
keyboard 键盘类型发生了改变,比如用户试用了外插键盘。
keyboardHidden 键盘可访问性发生了改变,比如用户调出了键盘
navigation 系统导航发生了改变,比如采用了轨迹球导航,很难发生,可以忽略此项。
screenLayout 屏幕布局发生了改变,很可能是用户激活了另外一个显示设备。
fontScale 系统字体缩放比例发生了改变,比如用户选择了一个新字号。
uiMode 用户界面模式发生了改变,比如是否开启了夜间模式。
orientation 屏幕方向发生了改变,这个是常用的,比如旋转了手机屏幕。
screenSize

当屏幕尺寸信息发生了改变,当选择设备时,屏幕尺会发生变化,这个选项比较特殊,它和编译选项有关,当编译选择中的minSdkVersion和tarSdkversion均低于13时,此选项不会导致Activity重启,否则会导致Activity重启。

smallestScreenSize 设备的物理屏幕尺寸发生改变,这个项目和屏幕的方向没关系,仅仅表示在实际的物理屏幕的尺寸改变的时候发生,比如用户切换到了外部的显示设备,这个选项和screenSize一样,当编译中的minSdkVersion和targetSdkVersion均低于13时,此选项不会导致Activity重启,否则会导致Activity重启。
lyoutDirection 当布局方向发生变化,这个属性用的比较少,正常情况下无须修改布局的layoutDirection属性(API17新添加)

1.3 Activity启动模式

1.3.1 Activity的LaunchMode

四种启动模式:standard(默认),singleTop、singleTask和singleInstance。

  1. standard:标准模式,每次启动一个Activity都会重新创建一个新的实例,不管这个实例是否已经存在。
  2. singleTop:栈顶复用模式,
      • 如果新的Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时它的onNewIntent方法会被回调;
      • 如果要创建的Activity不处于栈顶,此时会又一次创建一个新的Activity入栈,同Standard模式一样。
  3. singleTask:栈内复用模式。这是一种单实例模式,在这种模式下,只要Activity在一个栈中存在,此时不会创建新的Activity,
      • 而是将存在栈中的Activity上面的其他Activity所有销毁,使他成为栈顶,和singleTop一样系统也会回调其onNewIntent方法。
  4. singleInstance:单实例模式。这是一种加强singleTask模式,它除了具有singleTask模式的所有特性外,还加强了一点,
      • 那就是具有此种模式的Activity只能单独地位于一个任务栈中。比如,Activity A是singleInstance模式,当A启动后,系统会为它创建一个新的任务栈,
      • 然后A独自在这个新的任务栈中,由于栈内复用的特性,后续的请求均不会创建新的Activity,除非这个独特的任务栈被系统销毁了。这种模式一般不会应用到。

  

          standard

              singleTop

                singleTask

给Activity指定启动模式:

  1. 通过AndroidMenifest为Activity

   

 <activity
android:name=".Activity_a"
android:configChanges="orientation|keyboardHidden|screenSize"
android:launchMode="singleTask">

  2.通过在Intent中设置标志位来为Activity指定启动模式    

Intent intent = new Intent(this,Activity_b.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

1.3.2  Activity 的Flags

FLAG_ACTIVITY_NEW_TASK 这个标记为的作用是为Activity指定“singleTask”启动模式,其效果和在XML中指定该启动模式相同。

FLAG_ACTIVITY_SINGLE_TOP 这个标记位的作用是为Activity指定“singleTop”启动栈模式,其效果和在xml中指定该启动模式相同

FLAG_ACTIVITY_CLEAR_TOP 具有此标记的Activity,当它启动时,在同一个任务栈中所有位于它上面的Activity都要出栈,

  这个模式一般需要和FLAG_ACTIVITY_NEW_TASK配合使用,在这种情况下,被启动Activity的实例如果基金存在,那么系统就会调用它的onNewIntent。

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:具有这个标记的Activity不会出现在历史Activity的列表中,当某些情况下我们不希望用户通过历史列表回到

  我们的Activity的时候这个标记比较有用。它等同于在XML中指定Activity的属性android:excludeFromRecents="true".

二 .intent

Intent 直译为意图

是Activity,Service和BroadCastReceiver这三个组件之间的信使。

意图对象还可以携带数据

//下面是Intent启动不同组件的部分方法:
 Activity组件:
 startActivity(Intent intent);startActivityForResult(Intent intent,int requestCode);
 Service组件:
 startService(Intent intent);bindService(Intent intent,ServiceConnection conn,int flags);
 BroadcastReceiver组件:
 sendBroadcast(Intent intent);sendOrderedBroadcast(Intent intent,String receiverPermission);

2.1 显示意图

明确指定的目标组件的意图

    创建对象:Intent(Context context,Class clazz)

    何时使用:当操作当前自己应用的组件时使用    

Intent(Context packagecontext,Class<?> cls) :用于创建显示意图对象
Intent(String action):用于创建隐式意图对象
putExtra(String name,Xxx value):保存额外数据
Xxx getXxxExtra(String name):获取额外数据
setData(Url data):设置有特定格式的url数据

2.2 隐式意图

没有明确指定目标组件的意图

    创建对象:intent(String action)

    何时使用:当操作其它应用的组件时使用。

2.3 IntentFilter的理解

  在配置Activity时,可以为Activity指定一个IntentFilter的配置

  如果你的Activity希望其它用用能访问到,需要配置<intent-filter>

  如果你想启动其它应用的界面你必须用隐式intent,且目标界面Activity配置了<intent-filter>

  他的作用类似于web中的为Servlet配置<url-pattern>

  IntentFilter中过滤信息有action、category、data。

  <intent-filter/>是每一个Activity对应的过滤器标签节点。每一个过滤器里面的元素可以有: 0个或多个<action.../>; 0个或多个<category.../>; 0个或1个<data.../>

 2.3.1 action

  最常用的是Action_MAIN(作为初始的Activity启动,没有数据的输入输出)
  1. ACTION_MAIN 作为一个主要的进入口,而并不期望去接受数据
  2. ACTION_VIEW 向用户去显示数据
  3. ACTION_ATTACH_DATA 别用于指定一些数据应该附属于一些其他的地方,例如,图片数据应该附属于联系人
  4. ACTION_EDIT 访问已给的数据,提供明确的可编辑
  5. ACTION_GET_CONTENT 允许用户选择特殊种类的数据,并返回(特殊种类的数据:照一张相片或录一段音) ACTION_DIAL 拨打一个指定的号码,显示一个带有号码的用户界面,允许用户去启动呼叫
  6. ACTION_CALL 根据指定的数据执行一次呼叫(有缺陷,使用ACTION_DIAL)
  7. ACTION_SEND 传递数据,被传送的数据没有指定,接收的action请求用户发数据
  8. ACTION_SENDTO 发送一条信息到指定的某人
  9. ACTION_ANSWER 处理一个打进电话呼叫
  10. ACTION_INSERT 插入一条空项目到已给的容器
  11. ACTION_DELETE 从容器中删除已给的数据
  12. ACTION_SEARCH 执行一次搜索
  13. ACTION_WEB_SEARCH 执行一次web搜索

  14.ACTION_EDIT:系统根据不同的Data类型,通过已注册的对应Application编辑示数据。 
  15.ACTION_DIAL:系统默打开拨号程序,如果Data中设置电话号码,则拨号框中会显示此号码。  。  
  16.ACTION_BOOT_COMPLETED:Android系统在启动完毕后发出带有此Action的广播(Broadcast)。 
  17.ACTION_TIME_CHANGED:Android系统的时间发生改变后发出带有此Action的广播(Broadcast)。 
  18.ACTION_PACKAGE_ADDED:Android系统安装了新的App之后发出带有此Action的广播(Broadcast)。 
  19.ACTION_PACKAGE_CHANGED:Android系统中已存在的App发生改变之后(如更新)发出带有此Action的广播(Broadcast)。 
  20.ACTION_PACKAGE_REMOVED:Android系统卸载App之后发出带有此Action的广播(Broadcast)。
上面的动作都是Intent对象引用才有实际意义的。
setAction(String action) 用来设置Intent的动作,参数可以为常量
getAction() 方法用来获取Intent动作名称
上面的Action都是系统定义好的,具有一定意义的动作指向的动作。
Intent的Action对象其实就是一个字符串常量,系统的Action对象是系统定义好的字符串常量,我们也可以自己定义自己的Action作为字符串常量。

2.3.2 category

  Intent的action、category属性都是普通的字符串,其中action表示Intent需要完成的一个抽象”动作”,而category则为action添加额外的类别信息,通常action和category一块使用。
需要指出的是,一个Intent中只能包含一个action属性,但可以包含多个category属性。当程序创建Intent时,该Intent默认启动常量值andorid.intent.category.DEFAULT的组件。

这里的一个Intent中只能包含一个action属性,并不是Activity中xml的设置规范,而是你要跳转到的页面去,你只能设置一个Action的值。
常用的Category:
 1.CATEGORY_DEFAULT:Android系统中默认的执行方式,按照普通Activity的执行方式执行。 
 2.CATEGORY_HOME:设置该组件为Home Activity。
 3.CATEGORY_PREFERENCE:设置该组件为Preference。 
 4.CATEGORY_LAUNCHER:设置为当前应用程序优先级最高的Activity,通常与ACTION_MAIN配合使用。 
 5.CATEGORY_BROWSABLE:设置该组件可以使用浏览器启动。 
 6.CATEGORY_GADGET:设置该组件可以内嵌到另外的Activity中。
上面的类别都是Intent对象引用才有实际意义的。

2.3.3 data  

  Data数据用来向Action属性提供动作的数据。这里的Data不是Intent里面的数据,而是指明动作的具体数据,比如说动作是打电话,那么打给具体的某一个人,

就用到了date里面的数据来指定。同样发邮件、或打开具体的某一个网址也是通过Data数据。Data属性只接受Uri对象,Uri对象是统一资源标识符。对应概念不用太多理解,

只需知道里面某些具体值的表现形式就可以了。
Uri其实就是相当于一个网址,如图所示:网址只是Uri其中一种格式的字符串,要使用它还要把它解析后转化为Uri类型。

为Intent对象添加Data数据,代码:
intent.setData(Uri.parse(“http://www.baidu.com“));
这里的Uri的有两个没显示的属性:port的值是8080,path的值是/index

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);

2.3.4 type

与Data有关的,这个不是Intent的数据类型,是Intent的Action的Data数据的类型。
比如:
MimeType:
{“.3gp”, “video/3gpp”},
{“.apk”, “application/vnd.android.package-archive”},
{“.asf”, “video/x-ms-asf”},
{“.avi”, “video/x-msvideo”},
{“.bin”, “application/octet-stream”},
{“.bmp”, “image/bmp”},
{“.c”, “text/plain”},
{“.class”, “application/octet-stream”},
{“.conf”, “text/plain”},
{“.cpp”, “text/plain”},
{“.doc”, “application/msword”},
{“.docx”, “application/vnd.openxmlformats-officedocument.wordprocessingml.document”},
{“.xls”, “application/vnd.ms-excel”},
{“.xlsx”, “application/vnd.openxmlformats-officedocument.spreadsheetml.sheet”},
{“.exe”, “application/octet-stream”},
{“.gif”, “image/gif”},
{“.gtar”, “application/x-gtar”},
{“.gz”, “application/x-gzip”},
{“.h”, “text/plain”},
{“.htm”, “text/html”},
{“.html”, “text/html”},
{“.jar”, “application/Java-archive”},
{“.java”, “text/plain”},
{“.jpeg”, “image/jpeg”},
{“.jpg”, “image/jpeg”},
{“.js”, “application/x-JavaScript”},
{“.log”, “text/plain”},
{“.m3u”, “audio/x-mpegurl”},
{“.m4a”, “audio/mp4a-latm”},
{“.m4b”, “audio/mp4a-latm”},
{“.m4p”, “audio/mp4a-latm”},
{“.m4u”, “video/vnd.mpegurl”},
{“.m4v”, “video/x-m4v”},
{“.mov”, “video/quicktime”},
{“.mp2”, “audio/x-mpeg”},
{“.mp3”, “audio/x-mpeg”},
{“.mp4”, “video/mp4”},
{“.mpc”, “application/vnd.mpohun.certificate”},
{“.mpe”, “video/mpeg”},
{“.mpeg”, “video/mpeg”},
{“.mpg”, “video/mpeg”},
{“.mpg4”, “video/mp4”},
{“.mpga”, “audio/mpeg”},
{“.msg”, “application/vnd.ms-outlook”},
{“.ogg”, “audio/ogg”},
{“.pdf”, “application/pdf”},
{“.png”, “image/png”},
{“.pps”, “application/vnd.ms-powerpoint”},
{“.ppt”, “application/vnd.ms-powerpoint”},
{“.pptx”, “application/vnd.openxmlformats-officedocument.presentationml.presentation”},
{“.prop”, “text/plain”},
{“.rc”, “text/plain”},
{“.rmvb”, “audio/x-pn-realaudio”},
{“.rtf”, “application/rtf”},
{“.sh”, “text/plain”},
{“.tar”, “application/x-tar”},
{“.tgz”, “application/x-compressed”},
{“.txt”, “text/plain”},
{“.wav”, “audio/x-wav”},
{“.wma”, “audio/x-ms-wma”},
{“.wmv”, “audio/x-ms-wmv”},
{“.wps”, “application/vnd.ms-works”},
{“.xml”, “text/plain”},
{“.z”, “application/x-compress”},
{“.zip”, “application/x-zip-compressed”},
这里只是做几个简单的示例介绍,如果是打开gif格式的数据文件,设置type=“image/gif”

tel://:号码数据格式,后跟电话号码。 
mailto://:邮件数据格式,后跟邮件收件人地址。
smsto://:短息数据格式,后跟短信接收号码。
content://:内容数据格式,后跟需要读取的内容。 
file://:文件数据格式,后跟文件路径。
market://search?q=pname:pkgname:市场数据格式,在Google Market里搜索包名为pkgname的应用。
geo://latitude, longitude:经纬数据格式,在地图上显示经纬度所指定的位置。

2.3.5 extras

Extras属性主要用于传递目标组件所需要的额外的数据。这个数据是可以通过Intent来保存的数据和Intent对象来获取数据。

通过putExtras()方法设置。保存数据

通过putExtras()方法设置。获取数据

通常我们使用Intent来直接传递Bundle对象,但也可以传递其他系统内置的一些参数。
如果要传递是是对象,那么对象必须实现序列化。

EXTRA_BCC:存放邮件密送人地址的字符串数组。 
   EXTRA_CC:存放邮件抄送人地址的字符串数组。
 EXTRA_EMAIL:存放邮件地址的字符串数组。 
 EXTRA_SUBJECT:存放邮件主题字符串。 
 EXTRA_TEXT:存放邮件内容。 
 EXTRA_KEY_EVENT:以KeyEvent对象方式存放触发Intent的按键。  
 EXTRA_PHONE_NUMBER:存放调用ACTION_CALL时的电话号码。

2.3.6 具体使用

/**
* 跳转到指定的网址页面
*/
public void toView(View v) {
Intent intent = new Intent();
//设置Data数据
intent.setData(Uri.parse("http://www.baidu.com"));
//设置Action数据
intent.setAction(Intent.ACTION_VIEW);
//页面跳转
startActivity(intent);
} /**
* 跳转到编辑联系人的信息
* 这里联系人的姓名是:1
*/
public void toEdit(View v) {
Intent intent = new Intent();
//设置Data数据
intent.setData(Uri.parse("content://com.android.contacts/contacts/1"));
//设置Action数据
intent.setAction(Intent.ACTION_EDIT);
//页面跳转
try {
startActivity(intent);
} catch (Exception e) {
Toast.makeText(this, "找不到该联系人!", Toast.LENGTH_SHORT).show();
}
} /**
* 跳转到拨打电话的页面
* Data可以设置电话号码
*/
public void toDial(View v) {
Intent intent = new Intent();
//设置Data数据
intent.setData(Uri.parse("tel:13814236512"));
//设置Action数据
intent.setAction(Intent.ACTION_DIAL);
//页面跳转
startActivity(intent);
}

三 实例代码

https://github.com/MichealPan9999/Activity_1

3.1 启动Activity

3.1.1 startActivityForResult(Intent intent,int requestCode)

Activity a:

//点击按钮跳转到Activity b
Intent intent = new Intent(this,Activity_b.class);
// 这里不能用SingleTask启动模式。intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(intent,RESULT_FIRST_USER);
...
// 退出Activity b时获取到Activity b返回的值
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
     if(data !=null)
    {
String result = data.getExtras().getString("result");
     tv_result.setText("requestCode = "+requestCode +", resultCode = "+resultCode+" , result = "+ result);
    }
}

Activity b:

public void closeb(View view)
{
Intent intent = new Intent();
intent.putExtra("result","来自Activity b");
Activity_b.this.setResult(RESULT_OK,intent);
Activity_b.this.finish();
}

3.1.2 startActivity 及 Intent配置

1.根据类名跳转

Intent intent = new Intent();
intent.setClass(Activity_a.this,Activity_b.class);
Activity_a.this.startActivity(intent);
2.明确的包名及Activity
Intent intent = new Intent();
//new ComponentName("包名(应用本身所在的包,通过AndroidManifest.xml中package属性查看)","包名.类名(Activity所在的包)");
ComponentName comp = new ComponentName("com.example.panzq.simpleandroid_1","com.example.panzq.simpleandroid_1.Activity_b");
//或者intent.setClassName("包名","包名.类名");
intent.setComponent(comp);
startActivity(intent);

3.不明确的Intent

Intent intent = new Intent();
intent.setAction(Intent.ACTION_MAIN); // 应用程序的入口
intent.addCategory(Intent.CATEGORY_HOME); // 桌面的应用程序
startActivity(intent);

3.2 Intent 携带数据

3.2.1 putExtra

Activity_a 发送方

Intent intent = new Intent();
intent.putExtra("name", "诸葛亮");
intent.putExtra("age", 50);
intent.putExtra("IQ", 200.0f);
intent.setClass(Activity_a.this, Activity_b.class);
Activity_a.this.startActivity(intent);

Activity_b 接收方

Intent intent = getIntent();
String name = intent.getStringExtra("name");
int age = intent.getIntExtra("age", 0);
float IQ = intent.getFloatExtra("IQ", 0.0f);
Log.d("panzqww","name:"+name+",age:"+age+",IQ:"+IQ);//name:诸葛亮,age:50,IQ:200.0

3.2.2 Bundle

Activity_a 发送方

Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putString("name", "乔峰");
bundle.putInt("age", 40);
bundle.putFloat("weight", 70.4f);
intent.putExtras(bundle);
intent.setClass(Activity_a.this, Activity_b.class);
Activity_a.this.startActivity(intent);

Activity_b接收方

Intent intent = getIntent();
Bundle bundle = intent.getExtras();
String name = bundle.getString("name");
int age = bundle.getInt("age");
float weight = bundle.getFloat("weight");
Log.d("panzqww",name+","+age+","+weight);//乔峰,40,70.4

3.2.3 Parcelable

Activity_a 发送方

Intent intent = new Intent();
Person person = new Person("孙悟空",500,55.6f);
intent.putExtra("person", person);
intent.setClass(Activity_a.this, Activity_b.class);
startActivity(intent);

Activity_b 接收方

Intent intent = getIntent();
Person person = intent.getParcelableExtra("person");
Log.d("panzqww",person.getName()+","+person.getAge()+person.getWeight());

Person类实现Parcelable接口

package com.example.panzq.simpleandroid_1;

import android.os.Parcel;
import android.os.Parcelable; public class Person implements Parcelable{ private String name;
private int age;
private float weight; //省略 setter getter方法public Person(String name, int age, float weight) {
this.name = name;
this.age = age;
this.weight = weight;
} protected Person(Parcel in) {
name = in.readString();
age = in.readInt();
weight = in.readFloat();
} public static final Creator<Person> CREATOR = new Creator<Person>() {
@Override
public Person createFromParcel(Parcel in) {
return new Person(in);
} @Override
public Person[] newArray(int size) {
return new Person[size];
}
}; @Override
public int describeContents() {
return 0;
} @Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(name);
parcel.writeInt(age);
parcel.writeFloat(weight);
} }

最新文章

  1. Windows API 设置窗口下控件Enable属性
  2. inotify resources exhausted
  3. Nivo Slider - 世界上最棒的 jQuery 图片轮播插件
  4. Python基础教程之List对象 转
  5. 极其简单的使用基于gulp和sass前端工作流
  6. php版获取重定向后地址的代码分享
  7. [转] .bss段和.data段的区别
  8. javascript - 工作笔记 (事件四)
  9. C++静态局部对象
  10. RoleManager 进行角色管理
  11. 第三次C语言作业
  12. 【XSY3048 】Polynominal 数学
  13. Python3编写网络爬虫05-基本解析库XPath的使用
  14. C语言练手游戏-控制台输出一个会移动的坦克
  15. python练习题-day6
  16. 10.26 配置psplkf小程序
  17. SPA单页面应用
  18. chattr与lsattr命令
  19. WIKIOI 1026 逃跑的拉尔夫 深度优先搜索
  20. Java AES 加密工具类

热门文章

  1. flex布局下overflow失效问题
  2. rem+js响应式布局的设置
  3. WIN10配置MongoDB
  4. maven(一) 一 修改仓库存放路径
  5. jquery判断表单内容是否为空
  6. 20165234 《Java程序设计》第三周学习总结
  7. win10家庭版多用户
  8. 修改/dev/shm大小 tmps
  9. window安装mysql(详细步骤)
  10. Golang -- Signal处理