这是什么啊

Android06_Intent及其七大属性及intent-filter设置

Intent及其七大属性及intent-filter设置
如何实现Activity页面跳转?
1、Intent intent = new Intent(MainActivity.this,NextActivity.class);
2、intent.setClass(MainActivity.this, NextActivity.class);
startActivity(intent);
1、启动Activity:
  • startActivity()
  • startActivtyForResult()
三、Intent的七大属性:【重要】
Intent对象大致包括7大属性:ComponentName、  Action 、 Category 、 Data  、Type、  Extra  、Flags
(一)、ComponentName属性:
1、指定了ComponentName属性的Intent已经明确了它将要启动哪个组件,因此这种Intent被称为显式Intent,没有指定ComponentName属性的Intent被称为隐式Intent。
Intent intent = new Intent();
ComponentName cName = new ComponentName(MainActivity.this,NextActivity.class);
ComponentName cName = new ComponentName(app间实现跳转"com.steven.testasyncloader.sqlitedata","com.steven.testasyncloader.sqlitedata.MainActivity");
intent.setComponent(cName);
startActivity(intent);
Intent intent = new Intent(); 
intent.setAction("com.steven.android06lifecycle.nextactivity"); 
startActivity(intent);
//在配置文件中注册Activity的时候需要声明:
<activity android:name="com.steven.android06lifecycle.NextActivity">
<intent-filter>
<action android:name="com.steven.android06lifecycle.nextactivity" />
<category android:name="android.intent.category.DEFAULT" />  
</intent-filter>
</activity>
//当某个页面是默认启动页面时,需要定义Action、Category的属性必须为以下字符串:【设置任务入口】
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
Action 
Action常量对应字符串简单说明
ACTION_MAINandroid.intent.action.MAIN应用程序入口
ACTION_VIEWandroid.intent.action.VIEW显示指定数据
ACTION_ATTACH_DATAandroid.intent.action.ATTACH_DATA指定某块数据将被附加到其它地方
ACTION_EDITandroid.intent.action.EDIT编辑指定数据
ACTION_PICKandroid.intent.action.PICK从列表中选择某项并返回所选的数据
ACTION_CHOOSERandroid.intent.action.CHOOSER显示一个Activity选择器
ACTION_GET_CONTENTandroid.intent.action.GET_CONTENT让用户选择数据,并返回所选数据
ACTION_DIALandroid.intent.action.DIAL显示拨号面板
ACTION_CALLandroid.intent.action.CALL直接向指定用户打电话
ACTION_SENDandroid.intent.action.SEND向其他人发送数据
ACTION_SENDTOandroid.intent.action.SENDTO向其他人发送消息
ACTION_ANSWERandroid.intent.action.ANSWER应答电话
ACTION_INSERTandroid.intent.action.INSERT插入数据
ACTION_DELETEandroid.intent.action.DELETE删除数据
ACTION_RUNandroid.intent.action.RUN运行维护
ACTION_SYNCandroid.intent.action.SYNC执行数据同步
ACTION_PICK_ACTIVITYandroid.intent.action.PICK_ACTIVITY用于选择Activity
ACTION_SEARCHandroid.intent.action.SEARCH执行搜索
ACTION_WEB_SEARCHandroid.intent.action.WEB_SEARCH执行Web搜索
ACTION_FACTORY_TESTandroid.intent.action.FACTORY_TEST工厂测试的入口点

Category 
Category常量对应字符串简单说明
CATEGORY_DEFAULTandroid.intent.category.DEFAULT默认的Category
CATEGORY_BROWSABLEandroid.intent.category.BROWSABLE指定该Activity能被浏览器安全调用
CATEGORY_TABandroid.intent.category.TAB指定Activity作为TabActivity的Tab页
CATEGORY_LAUNCHERandroid.intent.category.LAUNCHERActivity显示顶级程序列表中
CATEGORY_INFOandroid.intent.category.INFO用于提供包信息
CATEGORY_HOMEandroid.intent.category.HOME设置该Activity随系统启动而运行
CATEGORY_PREFERENCEandroid.intent.category.PREFERENCE该Activity是参数面板
CATEGORY_TESTandroid.intent.category.TEST该Activity是一个测试
CATEGORY_CAR_DOCKandroid.intent.category.CAR_DOCK指定手机被插入汽车底座(硬件)时运行该Activity
CATEGORY_DESK_DOCKandroid.intent.category.DESK_DOCK指定手机被插入桌面底座(硬件)时运行该Activity
CATEGORY_CAR_MODEandroid.intent.category.CAR_MODE设置该Activity可在车载环境下使用
(四)、Data属性:
  1、Data属性通常用于向Action属性提供操作的数据。Data属性的值是个Uri对象。
        Uri的格式如下:scheme://host:port/path
    2、系统内置的几个Data属性常量:
  •   tel://:号码数据格式,后跟电话号码。
  •   mailto://:邮件数据格式,后跟邮件收件人地址。
  •   smsto://:短息数据格式,后跟短信接收号码。
  •   content://:内容数据格式,后跟需要读取的内容。
  •   file://:文件数据格式,后跟文件路径。
  •   market://search?q=pname:pkgname:市场数据格式,在Google Market里搜索包名为pkgname的应用。
  •   geo://latitude, longitude:经纬数据格式,在地图上显示经纬度所指定的位置。
    3、Intent利用Action属性和Data属性启动Android系统内置组件的代码:【不需要记忆,用到的时候查找资料】
(一)、拨打电话:
Intent intent=new Intent(); 
intent.setAction(Intent.ACTION_CALL);  
//intent.setAction("android.intent.action.CALL");  //以下各项皆如此,都有两种写法。
intent.setData(Uri.parse("tel:1320010001"));
startActivity(intent);
(二)、利用Uri打开浏览器、打开地图等:
Uri uri = Uri.parse("http://www.google.com"); //浏览器 
Uri uri=Uri.parse("geo:39.899533,116.036476"); //打开地图定位 
Intent intent = new Intent(); 
intent.setAction(Intent.ACTION_VIEW); 
intent.setData(uri);
startActivity(intent); 
(五)、Type属性:
    1、Type属性用于指定Data所指定的Uri对应的MIME类型。MIME只要符合“abc/xyz”这样的字符串格式即可
(三)、播放视频:
Intent intent = new Intent(); 
Uri uri = Uri.parse("file:///sdcard/media.mp4"); 
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(uri, "video/*"); 
startActivity(intent);
(六)、Extra属性:
    1、通过intent.putExtra(键, 值)的形式在多个Activity之间进行数据交换。 
    2、系统内置的几个Extra常量:
  •   EXTRA_BCC:存放邮件密送人地址的字符串数组。
  •   EXTRA_CC:存放邮件抄送人地址的字符串数组。
  •   EXTRA_EMAIL:存放邮件地址的字符串数组。
  •   EXTRA_SUBJECT:存放邮件主题字符串。
  •   EXTRA_TEXT:存放邮件内容。
  •   EXTRA_KEY_EVENT:以KeyEvent对象方式存放触发Intent的按键。
  •   EXTRA_PHONE_NUMBER:存放调用ACTION_CALL时的电话号码。
调用发送短信的程序 
Intent  intent  = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setType("vnd.android-dir/mms-sms"); 
intent.putExtra("sms_body", "信息内容..."); 
startActivity(intent);
//发送短信息 
Uri uri = Uri.parse("smsto:13200100001"); 
Intent  intent  = new Intent(); 
intent.setAction(Intent.  ACTION_SENDTO );
intent.setData(uri);
intent.putExtra("sms_body", "信息内容..."); 
startActivity( intent ); 
//发送彩信,设备会提示选择合适的程序发送 
Uri uri = Uri.parse("content://media/external/images/media/23"); //设备中的资源(图像或其他资源) 
Intent intent = new Intent(); 
intent.setAction(Intent.  ACTION_SEND );
intent.setType("image/png"); 
intent.putExtra("sms_body", "内容"); 
intent.putExtra(Intent.EXTRA_STREAM, uri); 
startActivity(it);
(五)、发送Email:
Intent intent=new Intent(); 
intent.setAction(Intent.  ACTION_SEND );
String[] tos={"android1@163.com"}; 
String[] ccs={"you@yahoo.com"}; 
intent.putExtra(Intent.EXTRA_EMAIL, tos); 
intent.putExtra(Intent.EXTRA_CC, ccs);
intent.putExtra(Intent.EXTRA_TEXT, "The email body text"); 
intent.putExtra(Intent.EXTRA_SUBJECT, "The email subject text"); 
intent.setType("message/rfc822"); 
startActivity(Intent.createChooser(intent, "Choose Email Client"));


    Intent intent = new Intent(Intent.ACTION_SEND);
    String[] tos = { "mobileservice@ablesky.com" };
    intent.putExtra(Intent.EXTRA_EMAIL, tos);
    intent.putExtra(Intent.EXTRA_TEXT, getPhoneParameter());
    intent.putExtra(Intent.EXTRA_SUBJECT, "Android日志");
    intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(cacheDir));
    intent.setType("message/rfc882");
    intent.setType("plain/text");
    Intent.createChooser(intent, "请选择邮件发送软件");
    startActivity(intent);  
intent.setAction(android.provider.Settings.ACTION_SETTINGS);
 4、 Intent利用Action属性中的ACTION_GET_CONTENT获取返回值:
//选择图片 requestCode 返回的标识
Intent intent = new Intent(); 
intent.setAction(Intent. ACTION_GET_CONTENT );
intent.setType( "image/*" ); 
Intent wrapperIntent = Intent.createChooser(intent, null);
startActivityForResult(wrapperIntent, requestCode);  


//添加音频
Intent intent = new Intent();
intent.setAction(Intent. ACTION_GET_CONTENT );
intent.setType( "video/*" ); 
Intent wrapperIntent = Intent.createChooser(intent, null);
startActivityForResult(wrapperIntent, requestCode);  


//视频
Intent intent = new Intent();
intent.setAction(Intent. ACTION_GET_CONTENT );
intent.setType( "video/*" ); 
Intent wrapperIntent = Intent.createChooser(intent, null);
startActivityForResult(wrapperIntent, requestCode);  


//录音
Intent intent = new Intent();
intent.setAction(Intent. ACTION_GET_CONTENT );
intent.setType( "audio/amr" ); 
intent.setClassName("com.android.soundrecorder","com.android.soundrecorder.SoundRecorder");
startActivityForResult(intent, requestCode);  
(七)、Flags属性:Intent可调用addFlags()方法来为Intent添加控制标记。【重要
    1、FLAG_ACTIVITY_CLEAR_TOP:(效果同Activity  LaunchMode的singleTask)
        如果在栈中已经有该Activity的实例,就重用该实例。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。 
    2、FLAG_ACTIVITY_SINGLE_TOP:(效果同Activity  LaunchMode的singleTop)
        如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,而不会创建新的Activity对象。
  
    3、FLAG_ACTIVITY_NEW_TASK: (效果类似Activity  LaunchMode的singleInstance
【备注:】以下几个为了解。
    4、FLAG_ACTIVITY_MULTIPLE_TASK:
    5、FLAG_ACTIVITY_BROUGHT_TO_FRONT:
    6、FLAG_ACTIVITY_RESET_TASK_IF_NEEDED:
示例代码:
Intent intent = new Intent(this, MainActivity.class); //将Activity栈中处于MainActivity主页面之上的Activity都弹出。 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent);
四、Activity的launchMode
   1、standard: (备注:standard是系统默认的启动模式,标准启动模式,每次激活Activity时都会创建Activity,并放入任务栈中。
   2、singleTop
        如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,而不会创建新的Activity对象,不过它会调用onNewIntent()方法。如果栈顶部不存在就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例)。
        如果启动此Activity的Intent中没有设置FLAG_ACTIVITY_NEW_TASK标志, 则这个Activity与启动他的Activity在同一个Task中,如果设置了Activity请参考上面FLAG_ACTIVITY_NEW_TASK的详细说明,"launchMode"设置为"singleTop"的Activity可以被实例化多次,  可以在Task中的任何位置, 对于一个新的Intent请求如果在Task栈顶, 则会用栈顶的Activity响影Intent请求,而不会重新实例化对象接收请求, 如果没有在栈顶, 则会实例化一个新的对象接收Intent请求.
   3、singleTask: 
        如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。 
        和singleTop在名字上即可看出区别,即singleTop每次只检测当前栈顶的Activity是否是我们需要请求创建的,而singleTask则会检测栈中全部的Activity对象,从上向下,如果检测到是我们所请求的则会消灭此Activity对象上面的对象,直接把检测到的我们需要的Activity置为栈顶。
        
        "launchMode"设置为"singleTask"的Activity总是在栈底, 只能被实例化一次, 它允许其它Activity压入"singleTask"的Activity所在的Task栈,如果有新的Intent请求有此标志的Activity, 则系统会清除有此标志的Task栈中的全部Activity,并把此Activity显示出来.
   4、singleInstance: 
        在一个新栈中创建该Activity实例,并让多个应用共享该Activity实例。一旦这种模式的Activity实例存在于某个栈中,任何应用再激活这个Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。此启动模式和我们使用的浏览器工作原理类似,在多个程序中访问浏览器时,如果当前浏览器没有打开,则打开浏览器,否则会在当前打开的浏览器中访问。此模式会节省大量的系统资源,因为他能保证要请求的Activity对象在当前的栈中只存在一个。
         "launchMode"设置为"singleInstance"的Activity总是在栈底, 只能被实例化一次, 不允许其它的Activity压入"singleInstance"的Activity所在Task栈,  即整个Task栈中只能有这么一个Activity.
五、利用Intent属性调用系统app的示例代码:

publicvoid clickButton(View view) {

Intent intent = new Intent();

intent.setAction(android.content.Intent.ACTION_VIEW);

switch (view.getId()) {

case R.id.button_main_call:

intent.setAction(Intent.ACTION_CALL);//跳拨号界面

intent.setData(Uri.parse("tel:10086"));

break;

case R.id.button_main_dial:

intent.setAction(Intent.ACTION_DIAL);//拨打电话

intent.setData(Uri.parse("tel:10086"));

break;

case R.id.button_main_sms:

intent.setAction(Intent.ACTION_SENDTO);

intent.setData(Uri.parse("smsto:10086"));//发送短信

intent.putExtra("sms_body", "该吃饭了,下课吧!");

break;

case R.id.button_main_setting:

intent.setAction("android.settings.SETTINGS");打开设置界面

intent.setAction(android.content.Intent.ACTION_VIEW);

intent.setData(Uri.parse("http://www.baidu.com"));打开网址

break;

case R.id.button_main_showimage:

intent.setAction(android.content.Intent.ACTION_VIEW);

intent.setDataAndType(Uri.fromFile(new File("mnt/sdcard/Download/landscape.jpg")),"image/*");打开图片

break;

case R.id.button_main_showtext:

intent.setAction(android.content.Intent.ACTION_VIEW);

intent.setDataAndType(Uri.fromFile(new File("mnt/sdcard/Download/info.txt")),"text/*");打开文本

break;

case R.id.button_main_home:

intent.setAction("android.intent.action.MAIN");

intent.addCategory("android.intent.category.HOME");跳转home页面


posted @ 2015-12-06 19:58  陈旭缘  阅读(3454)  评论(0)    收藏  举报
这是什么