Activity

Android于。Activity所有的程序都是必不可少,程都执行在Activity之中。Activity具有自己的生命周期(见http://www.cnblogs.com/feisky/archive/2010/01/01/1637427.html,由系统控制生命周期,程序无法改变。但能够用onSaveInstanceState保存其状态)。

对于Activity,关键是其生命周期的把握(例如以下图),其次就是状态的保存和恢复(onSaveInstanceState onRestoreInstanceState)。以及Activity之间的跳转和传输数据(intent)。

Activity中经常使用的函数有SetContentView()   findViewById()    finish()   startActivity(),其生命周期涉及的函数有:

void onCreate(Bundle savedInstanceState)

void onStart()

void onRestart()

void onResume()

void onPause()

void onStop()

void onDestroy()

注意的是,Activity的使用须要在Manifest文件里加入对应的<Activity>。并设置其属性和intent-filter。

Intent

Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责相应用中一次操作的动作、动作涉及数据、附加数据进行描写叙述,Android则依据此Intent的描写叙述。负责找到相应的组件,将 Intent传递给调用的组件,并完毕组件的调用。

Intent不仅可用于应用程序之间。也可用于应用程序内部的Activity/Service之间的交互。

因此。Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。在SDK中给出了Intent作用的表现形式为:

Intent属性的设置,包含下面几点:(下面为XML中定义,当然也能够通过Intent类的方法来获取和设置)

(1)Action,也就是要运行的动作

SDk中定义了一些标准的动作,包含

onstant Target component Action
ACTION_CALL activity Initiate a phone call.
ACTION_EDIT activity Display data for the user to edit.
ACTION_MAIN activity Start up as the initial activity of a task, with no data input and no returned output.
ACTION_SYNC activity Synchronize data on a server with data on the mobile device.
ACTION_BATTERY_LOW broadcast receiver A warning that the battery is low.
ACTION_HEADSET_PLUG broadcast receiver A headset has been plugged into the device, or unplugged from it.
ACTION_SCREEN_ON broadcast receiver The screen has been turned on.
ACTION_TIMEZONE_CHANGED broadcast receiver The setting for the time zone has changed.

当然,也能够自己定义动作(自己定义的动作在使用时,须要加上包名作为前缀,如"com.example.project.SHOW_COLOR”),并可定义对应的Activity来处理我们的自己定义动作。

(2)Data,也就是运行动作要操作的数据

Android中採用指向数据的一个URI来表示,如在联系人应用中。一个指向某联系人的URI可能为:content://contacts/1。对于不同的动作,其URI数据的类型是不同的(能够设置type属性指定特定类型数据),如ACTION_EDIT指定Data为文件URI。打电话为tel:URI,訪问网络为http:URI,而由content provider提供的数据则为content: URIs。

(3)type(数据类型)。显式指定Intent的数据类型(MIME)。

一般Intent的数据类型可以依据数据本身进行判定,可是通过设置这个属性,可以强制採用显式指定的类型而不再进行推导。

(4)category(类别),被运行动作的附加信息。

比如 LAUNCHER_CATEGORY 表示Intent 的接受者应该在Launcher中作为顶级应用出现;而ALTERNATIVE_CATEGORY表示当前的Intent是一系列的可选动作中的一个,这些动作能够在同一块数据上运行。还有其它的为

Constant Meaning
CATEGORY_BROWSABLE The target activity can be safely invoked by the browser to display data referenced by a link — for example, an image or an e-mail message.
CATEGORY_GADGET The activity can be embedded inside of another activity that hosts gadgets.
CATEGORY_HOME The activity displays the home screen, the first screen the user sees when the device is turned on or when the HOME key is pressed.
CATEGORY_LAUNCHER The activity can be the initial activity of a task and is listed in the top-level application launcher.
CATEGORY_PREFERENCE The target activity is a preference panel.

(5)component(组件)。指定Intent的的目标组件的类名称。通常 Android会依据Intent 中包括的其他属性的信息。比方action、data/type、category进行查找。终于找到一个与之匹配的目标组件。

可是,假设 component这个属性有指定的话,将直接使用它指定的组件,而不再运行上述查找过程。指定了这个属性以后。Intent的其他全部属性都是可选的。

(6)extras(附加信息),是其他全部附加信息的集合。

使用extras能够为组件提供扩展信息,比方。假设要运行“发送电子邮件”这个动作,能够将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件。

理解Intent的关键之中的一个是理解清楚Intent的两种基本使用方法:一种是显式的Intent,即在构造Intent对象时就指定接收者;还有一种是隐式的Intent。即Intent的发送者在构造Intent对象时,并不知道也不关心接收者是谁,有利于减少发送者和接收者之间的耦合。

对于显式Intent。Android不须要去做解析,由于目标组件已经非常明白,Android须要解析的是那些隐式Intent,通过解析,将 Intent映射给能够处理此Intent的Activity、IntentReceiver或Service。

Intent解析机制主要是通过查找已注冊在AndroidManifest.xml中的全部IntentFilter及当中定义的Intent,终于找到匹配的Intent。在这个解析过程中。Android是通过Intent的action、type、category这三个属性来进行推断的,推断方法例如以下:

  • 假设Intent指明定了action,则目标组件的IntentFilter的action列表中就必须包括有这个action。否则不能匹配;
  • 假设Intent没有提供type,系统将从data中得到数据类型。

    和action一样。目标组件的数据类型列表中必须包括Intent的数据类型。否则不能匹配。

  • 假设Intent中的数据不是content: 类型的URI。并且Intent也没有明白指定它的type,将依据Intent中数据的scheme (比方 http: 或者mailto:) 进行匹配。同上,Intent 的scheme必须出如今目标组件的scheme列表中。

  • 假设Intent指定了一个或多个category,这些类别必须所有出如今组建的类别列表中。比方Intent中包括了两个类别:LAUNCHER_CATEGORY 和 ALTERNATIVE_CATEGORY。解析得到的目标组件必须至少包括这两个类别。

Intent-Filter的定义

一些属性设置的样例:

<action android:name="com.example.project.SHOW_CURRENT" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="video/mpeg" android:scheme="http" . . . /> 
<data android:mimeType="image/*" />
<data android:scheme="http" android:type="video/*" />

完整的实例

<activity android:name="NotesList" android:label="@string/title_notes_list">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <action android:name="android.intent.action.EDIT" />
                <action android:name="android.intent.action.PICK" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.GET_CONTENT" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
            </intent-filter>
        </activity>

Intent使用方法实例

1.无參数Activity跳转

Intent it = new Intent(Activity.Main.this, Activity2.class);
startActivity(it);

2.向下一个Activity传递数据(使用Bundle和Intent.putExtras)

Intent it = new Intent(Activity.Main.this, Activity2.class);
Bundle bundle=new Bundle();
bundle.putString("name", "This is from MainActivity!");
it.putExtras(bundle); // it.putExtra(“test”, "shuju”);
startActivity(it); // startActivityForResult(it,REQUEST_CODE);

对于数据的获取能够採用:

Bundle bundle=getIntent().getExtras();
String name=bundle.getString("name");

3.向上一个Activity返回结果(使用setResult,针对startActivityForResult(it,REQUEST_CODE)启动的Activity)

        Intent intent=getIntent();
Bundle bundle2=new Bundle();
bundle2.putString("name", "This is from ShowMsg!");
intent.putExtras(bundle2);
setResult(RESULT_OK, intent);

4.回调上一个Activity的结果处理函数(onActivityResult)

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if (requestCode==REQUEST_CODE){
if(resultCode==RESULT_CANCELED)
setTitle("cancle");
else if (resultCode==RESULT_OK) {
String temp=null;
Bundle bundle=data.getExtras();
if(bundle!=null) temp=bundle.getString("name");
setTitle(temp);
}
}
}

以下是转载来的其它的一些Intent使用方法实例(转自javaeye)

显示网页

   1. Uri uri = Uri.parse("http://google.com"); 

   2. Intent it = new Intent(Intent.ACTION_VIEW, uri); 

   3. startActivity(it);

显示地图

   1. Uri uri = Uri.parse("geo:38.899533,-77.036476"); 

   2. Intent it = new Intent(Intent.ACTION_VIEW, uri);  

   3. startActivity(it);  

   4. //其它 geo URI 範例 

   5. //geo:latitude,longitude 

   6. //geo:latitude,longitude?z=zoom 

   7. //geo:0,0?q=my+street+address 

   8. //geo:0,0?q=business+near+city 

   9. //google.streetview:cbll=lat,lng&cbp=1,yaw,,pitch,zoom&mz=mapZoom

路径规划

   1. Uri uri = Uri.parse("http://maps.google.com/maps?f=d&saddr=startLat%20startLng&daddr=endLat%20endLng&hl=en"); 

   2. Intent it = new Intent(Intent.ACTION_VIEW, uri); 

   3. startActivity(it); 

   4. //where startLat, startLng, endLat, endLng are a long with 6 decimals like: 50.123456

打电话

   1. //叫出拨号程序 

   2. Uri uri = Uri.parse("tel:0800000123"); 

   3. Intent it = new Intent(Intent.ACTION_DIAL, uri); 

   4. startActivity(it); 

   1. //直接打电话出去 

   2. Uri uri = Uri.parse("tel:0800000123"); 

   3. Intent it = new Intent(Intent.ACTION_CALL, uri); 

   4. startActivity(it); 

   5. //用這個,要在 AndroidManifest.xml 中,加上 

   6. //<uses-permission id="android.permission.CALL_PHONE" />

传送SMS/MMS

   1. //调用短信程序 

   2. Intent it = new Intent(Intent.ACTION_VIEW, uri); 

   3. it.putExtra("sms_body", "The SMS text");  

   4. it.setType("vnd.android-dir/mms-sms"); 

   5. startActivity(it);

   1. //传送消息 

   2. Uri uri = Uri.parse("smsto://0800000123"); 

   3. Intent it = new Intent(Intent.ACTION_SENDTO, uri); 

   4. it.putExtra("sms_body", "The SMS text"); 

   5. startActivity(it);

   1. //传送 MMS 

   2. Uri uri = Uri.parse("content://media/external/images/media/23"); 

   3. Intent it = new Intent(Intent.ACTION_SEND);  

   4. it.putExtra("sms_body", "some text");  

   5. it.putExtra(Intent.EXTRA_STREAM, uri); 

   6. it.setType("image/png");  

   7. startActivity(it);

传送 Email

   1. Uri uri = Uri.parse("mailto:xxx@abc.com"); 

   2. Intent it = new Intent(Intent.ACTION_SENDTO, uri); 

   3. startActivity(it);

1. Intent it = new Intent(Intent.ACTION_SEND); 

   2. it.putExtra(Intent.EXTRA_EMAIL, "me@abc.com"); 

   3. it.putExtra(Intent.EXTRA_TEXT, "The email body text"); 

   4. it.setType("text/plain"); 

   5. startActivity(Intent.createChooser(it, "Choose Email Client"));

1. Intent it=new Intent(Intent.ACTION_SEND);   

   2. String[] tos={"me@abc.com"};   

   3. String[] ccs={"you@abc.com"};   

   4. it.putExtra(Intent.EXTRA_EMAIL, tos);   

   5. it.putExtra(Intent.EXTRA_CC, ccs);   

   6. it.putExtra(Intent.EXTRA_TEXT, "The email body text");   

   7. it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");   

   8. it.setType("message/rfc822");   

   9. startActivity(Intent.createChooser(it, "Choose Email Client"));

1. //传送附件

   2. Intent it = new Intent(Intent.ACTION_SEND); 

   3. it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text"); 

   4. it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/mysong.mp3"); 

   5. sendIntent.setType("audio/mp3"); 

   6. startActivity(Intent.createChooser(it, "Choose Email Client"));

播放多媒体

       Uri uri = Uri.parse("file:///sdcard/song.mp3"); 

       Intent it = new Intent(Intent.ACTION_VIEW, uri); 

       it.setType("audio/mp3"); 

       startActivity(it);

       Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1"); 

       Intent it = new Intent(Intent.ACTION_VIEW, uri); 

       startActivity(it);

Market 相关

1.        //寻找某个应用

2.        Uri uri = Uri.parse("market://search?q=pname:pkg_name");

3.        Intent it = new Intent(Intent.ACTION_VIEW, uri); 

4.        startActivity(it); 

5.        //where pkg_name is the full package path for an application

1.        //显示某个应用的相关信息

2.        Uri uri = Uri.parse("market://details?

id=app_id"); 

3.        Intent it = new Intent(Intent.ACTION_VIEW, uri);

4.        startActivity(it); 

5.        //where app_id is the application ID, find the ID  

6.        //by clicking on your application on Market home  

7.        //page, and notice the ID from the address bar

Uninstall 应用程序

1.        Uri uri = Uri.fromParts("package", strPackageName, null);

2.        Intent it = new Intent(Intent.ACTION_DELETE, uri);  

3.        startActivity(it);

版权声明:本文博主原创文章。博客,未经同意不得转载。

Android Intent机制与常见的用法的更多相关文章

  1. 最全面的Android Intent机制讲解

    对于大型软件开发经验较少的程序员来说,这可能是一个不太容易理解的抽象概念,因为它与我们平常使用的简单函数调用,或者通过库调用接口的方式不太一样.在 Intent 的使用中你看不到直接的函数调用,相对函 ...

  2. [转]android Intent机制详解

    转自:http://blog.csdn.net/t12x3456/article/details/7688154 1.什么是Intent Intent是一种运行时绑定(run-time binding ...

  3. android Intent机制详解

    http://www.oschina.net/question/565065_67909 http://www.cnblogs.com/hummersofdie/archive/2011/02/12/ ...

  4. 【Android开发日记】之入门篇(十一)——Android的Intent机制

    继续我们的Android之路吧.今天我要介绍的是Android的Intent. 对于基于组件的应用开发而言,不仅需要构造和寻找符合需求的组件,更重要的是要将组件有机的连接起来,互联互通交换信息,才能够 ...

  5. Android总结篇——Intent机制详解及示例总结

         最近在进行android开发过程中,在将 Intent传递给调用的组件并完成组件的调用时遇到点困难,并且之前对Intent的学习也是一知半解,最近特意为此拿出一些时间,对Intent部分进行 ...

  6. Android Intent用法总结

    Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 ...

  7. 【转】Android Activity和Intent机制学习笔记----不错

    原文网址:http://www.cnblogs.com/feisky/archive/2010/01/16/1649081.html Activity Android中,Activity是所有程序的根 ...

  8. Android Activity和Intent机制学习笔记

    转自 http://www.cnblogs.com/feisky: Activity Android中,Activity是所有程序的根本,所有程序的流程都运行在Activity之中,Activity具 ...

  9. Android Intent的几种用法全面总结

    Android Intent的几种用法全面总结 Intent, 用法 Intent应该算是Android中特有的东西.你可以在Intent中指定程序要执行的动作(比如:view,edit,dial), ...

随机推荐

  1. state pattern

    6 状态模式总结 状态模式将一个对象在不同状态下的不同行为封装在一个个状态类中,通过设置不同的状态对象可以让环境对象拥有不同的行为,而状态转换的细节对于客户端而言是透明的,方便了客户端的使用.在实际开 ...

  2. SICP 锻炼 (2.15)解决摘要:深入思考间隔误差

    SICP 2.15 是接着 题目 2.14 的, 题目 2.14中提到了Alyssa设计的区间计算模块在并联电阻计算时会出现故障,这个问题是Lem发现的. 接着,一个叫Eva的人也发现了这个问题.同一 ...

  3. effective c++ 条款18 make interface easy to use correctly and hard to use incorrectly

    举一个容易犯错的例子 class Date { private: int month; int day; int year; public: Date(int month,int day,int ye ...

  4. air mobile andriod ios 页面加载控件

    通过最近的研究flex 书写android .ios申请书,我们遇到了一个问题加载页面,我们用flex sdk 12,air 15 无级似android ListView寻呼模块.所以,我和我的同事们 ...

  5. 每天努力一点之SQL(二) count sum case when then group by

    1. select sum(CASE WHEN A.[STATUS]=0 THEN 1 ELSE 0 end) as a1,  sum(CASE A.[STATUS] WHEN 1 THEN 1 EL ...

  6. Android - match_parent 和 fill_parent差异

    Android - match_parent 和 fill_parent差异 本文地址: http://blog.csdn.net/caroline_wendy match_parent 和 fill ...

  7. 菜鸟版JAVA设计模式-从抽象与实现说桥接模式

    桥接模式,初学的时候事实上非常不理解为什么要把这个模式命名为桥接模式,脑海里突然联想到.事实上我学习是一件比較痛苦的事情,由于我必需要知道来龙去脉才干学的进去,所以,非常快我就对这个命名产生了兴趣,桥 ...

  8. CSA 第五届研讨会 想象

    参加第五届CSA云安全联盟研讨会. 人们太.所以,我们没有找到座位.立一个很长的时间.为了弥补没有时间坐在办公室.一个补回来.首先为大家介绍的信贷云,事实上独立: 信-使用-云 1. 信-使用-云 什 ...

  9. Objective C Runtime 开发介绍

    简介 Objective c 语言尽可能的把决定从编译推迟到链接到运行时.只要可能,它就会动态的处理事情.这就意味着它不仅仅需要一个编译器,也需要一个运行时系统来执行变异好的代码.运行时系统就好像是O ...

  10. Swift 书面 ToDo App

    下面的代码是使用的全部Xcode Version 6.0.1 (6A317)书面. 因为当使用团队开发stroyboard在并购的诸多不便的时间,所有或使用.xib该文件准备ToDo App. 想要实 ...