您的位置:首页 > 编程语言 > Go语言

Intent详细归纳;intentFilter,category,task,flags

2015-11-03 11:50 288 查看
Intent的启动方式:显式Intent,隐式Intent
对于明确指出了目标组件名称的Intent,我们称之为“显式Intent”,比如:Intent intent = new Intent(MainActivity.this,BodyActivity.class);

对于没有明确指出目标组件名称的Intent,则称之为“隐式 Intent”。Android系统使用IntentFilter来寻找隐式Intent相关的对象。比如:;Intent
intent = new Intent(Intent.ACTION_SEND);

显式Intent直接用组件的名称定义目标组件,这种方式很直接。但是由于开发人员往往并不清楚别的应用程序的组件名称,因此,显式Intent更 多用于在应用程序内部传递消息。比如在某应用程序内,一个Activity启动一个Service。

隐式Intent恰恰相反,它不会用组件名称定义需要 激活的目标组件,它更广泛地用于在不同应用程序之间传递消息,它会发送一种类型的action,让所有支持该类型的activity都收到消息,然后由用户选择使用哪个activity处理。

使用隐式Intent打开另一个app

try {  

    PackageManager packageManager = getPackageManager();   

    Intent intent=new Intent();   

    intent = packageManager.getLaunchIntentForPackage("com.tencent.mm");  

    startActivity(intent);  

} catch (Exception e) {  

    e.printStackTrace();  

    Intent viewIntent = new  

    Intent("android.intent.action.VIEW",Uri.parse("http://weixin.qq.com/"));  

    startActivity(viewIntent);  

}  
如果手机上安装了微信,就打开微信的主界面,如果没有安装就打开一个浏览器去下载!!!

打开某个app的某Activity

ComponentName componetName = new ComponentName(
//这个是另外一个应用程序的包名
"com.yunlv.imagebrowse",
//这个参数是要启动的Activity
"com.yunlv.imagebrowse.FengCaiActivity");
try {
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
intent.setComponent(componetName);
startActivity(intent);
} catch (Exception e) {
Log.v("go to apk error","------>"+e.toString());
}


总的来说,显示Intent是自己写的程序之间用,如果自己的某个activity想给其他程序用,或者说想用其他应用程序的某个acvivity,那就用隐式Intent。

把activity变成可以用隐式Intent打开:

在Manifest文件里面,该<activity><activity/>之间添加如下图红色框框中的内容,其中紫色的部分就是自己定义的隐式Intent需要的action名称,同时不要忘记category哦!



使用的时候:

Intent intent=new Intent(com.h3c.intent.ACTION_VIEW);

startActivity(intent);

或者:

Intent intent=new Intent();

intent.setAction(com.h3c.intent.ACTION_VIEW);(显式Intent是:intent.setClass(xxx.this,yyy.class);)

startActivity(intent);

category:分类
一般不要去在Intent中设置它,如果你写Intent的接收者,就在Manifest.xml的Activity的 IntentFilter中包含android.category.DEFAULT,这样所有不设置 Category(Intent.addCategory(String c);)的Intent都会与这个Category匹配。

设置app安装之后,不显示在桌面上(也就是不显示在launcher)

<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>

    一般情况下,当我们的APK在被安装后,系统会自动创建我们的APK程序,系统Launcher(系统桌面应用程序)会自动检测系统已经安装的应用软件的包名,然后把这些APP的图标和名称解析出来后显示在应用程序列表里,一旦我们像上面那样设置不显示APK图标,则APK程序不会在桌面上显示图标和名字。

    如果只是设置APP图标不可见而使用这种方式,打开APP是不会成功的,因为这样设置后,包名根本就没有加载到Launcher,所以通过 getPackageManager().getLaunchIntentForPackage()方法得到的Intent为null。

Activity的task

task是一个具有栈结构的容器,可以放置多个Activity实例。启动一个应用,系统就会为之创建一个task,来放置根Activity;默认情况下,一个Activity启动另一个Activity时,两个Activity是放置在同一个task中的,后者被压入前者所在的task栈,当用户按下后退键,后者从task被弹出,前者又显示在幕前,特别是启动其他应用中的Activity时,两个Activity对用户来说就好像是属于同一个应用;

系统task和task之间是互相独立的,当我们运行一个应用时,按下Home键回到主屏,启动另一个应用,这个过程中,之前的task被转移到后台,新的task被转移到前台,其根Activity也会显示到幕前,过了一会之后,在此按下Home键回到主屏,再选择之前的应用,之前的task会被转移到前台,系统仍然保留着task内的所有Activity实例,而那个新的task会被转移到后台,如果这时用户再做后退等动作,就是针对该task内部进行操作了。

1.Activity的affinity(亲和力)

2.Intent几种常见的flags

3.<activity>与task相关属性

affinity:

拥有相同affinity的多个Activity理论同属于一个task,task自身的affinity决定于根Activity的affinity值。affinity在什么场合应用呢?
1.根据affinity量新为Activity选择宿主task(与allowTaskReparenting属性配合工作);

2.启动一个Activity过程中Intent使用了FLAG_ACTIVITY_NEW_TASK标记,根据affinity查找或创建一个新的具有对应affinity的task。我们会在后面进行详细讲解。

默认情况下,一个应用内的所有Activity都具有相同的affinity,都是从Application(参考<application>的taskAffinity属性)继承而来,而Application默认的affinity是<manifest>中的包名,我们可以为<application>设置taskAffinity峞性值,这样可以应用到<application>下的所有<activity>,也可以单独为某�'B8�Activity设置taskAffinity。例如:在系统自带的Browser中,package为com.android.browser,但是<application>却自定义一个taskAffinity属性值:

1 <application   android:name="Browser"
2    android:label="@string/application_name"
3    android:icon="@drawable/ic_launcher_browser"
4    android:backupAgent=".BrowserBackupAgent"
5    android:taskAffinity="android.task.browser" >




Intent几种常见的flags:

在android.content.Intent中定义了若干个flags,其中最重要的有以下几个:

1.FLAG_ACTIVITY_NEW_TASK:根据Activity Affinity判断是否需要创建新的Task,然后再创建新的Activity实例放进去。
2.FLAG_ACTIVITY_CLEAR_TOP:启动的Activity会将Task中位于其上的Activity都强制出栈,使其自身位于栈顶。
在Standard模式下,如果原来的Activity栈顺序为 A -> B1 -> D, 此时D通过FLAG_ACTIVITY_CLEAR_TOP启动B,则栈顺序为A -> B2。对于同时设置了FLAG_ACTIVITY_SINGLE_TOP,则栈顺序为
A-> B1(此时回调onNewIntent*)..),此时效果与Activity启动模式中的singleTask相同。


Intent intent = new Intent(this, SecondActivity.class);
2 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
3 startActivity(intent);


3.FLAG_ACTIVITY_SINGLE_TOR:当task中存在目标Activity实例并且位于栈的顶端时,不再创建一个新的,直接利用这个实例。目前发现与Activity启动模式中的singleTop效果相同。
4.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET:

5.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

这个标记在以下情况下会生效:1.启动Activity时创建新的task来放置Activity实例;2.已存在的task被放置于前台。系统会根据affinity对指定的task进行重置操作,task会压入某些Activity实例或移除某些Activity实例。我们结合上面的CLEAR_WHEN_TASK_RESET可以加深理解。
详细介绍:http://www.cnblogs.com/lwbqqyumidi/p/3775479.html

Intent大全:



应用程序去商店评分

Uri uri = Uri.parse("market://details?id=" + getPackageName());
Intent intent = new Intent(Intent.ACTION_VIEW,uri);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);



这是网上说的可以打开一群,让你选择,我用小米手机尝试,只能打开小米自带的应用商店。
如果手机里面没有应用商店,那么上面的代码就会奔溃,有种简单的方法就是通过捕获异常来判断是不是有应用商店,如果需要更严谨的话,用下面的方法:参考网友:

//判断市场是否存在的方法
public static boolean isAvilible(Context context, String packageName){
final PackageManager packageManager = context.getPackageManager();//获取packagemanager
List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);//获取所有已安装程序的包信息
List<String> pName = new ArrayList<String>();//用于存储所有已安装程序的包名
//从pinfo中将包名字逐一取出,压入pName list中
if(pinfo != null){
for(int i = 0; i < pinfo.size(); i++){
String pn = pinfo.get(i).packageName;
pName.add(pn);
}
}
return pName.contains(packageName);//判断pName中是否有目标程序的包名,有TRUE,没有FALSE
}


//判断360市场是否存在
if (isAvilible(AppsActivity.this, "com.qihoo.appstore")) {
//市场存在
}else{
//市场不存在
}


/**
* 启动到app详情界面
* @param appPkg  App的包名
* @param marketPkg 应用商店包名 ,如果为""则由系统弹出应用商店列表供用户选择,否则调转到目标市场的应用详情界面,某些应用商店可能会失败
*/
public static void launchAppDetail(String appPkg, String marketPkg) {
try {
if (TextUtils.isEmpty(appPkg))
return;
Uri uri = Uri.parse("market://details?id=" + appPkg);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
if (!TextUtils.isEmpty(marketPkg))
intent.setPackage(marketPkg);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
AppUtils.getAppContext().startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
}


主流应用商店对应的包名如下:

com.qihoo.appstore  360手机助手

com.taobao.appcenter    淘宝手机助手

com.tencent.android.qqdownloader    应用宝

com.hiapk.marketpho
安卓市场     

cn.goapk.market 安智市场   

分享:





Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.setType("text/*");
sendIntent.putExtra(Intent.EXTRA_TEXT, "分享出去吧");
startActivity(sendIntent);


1.从google搜索内容 

Intent intent = new Intent(); 

intent.setAction(Intent.ACTION_WEB_SEARCH); 

intent.putExtra(SearchManager.QUERY,"searchString") 

startActivity(intent); 

2.浏览网页 

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

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

startActivity(it); 

startActivity(mmsintent); 

8.发送彩信 

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

Intent it = new Intent(Intent.ACTION_SEND);    

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

it.putExtra(Intent.EXTRA_STREAM, uri);    

it.setType("image/png");    

startActivity(it); 

StringBuilder sb = new StringBuilder(); 

sb.append("file://"); 

sb.append(fd.getCbsoluteFile()); 

Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mmsto", number, null)); 

// 下面的是可选的

intent.putExtra(Messaging.KEY_ACTION_SENDTO_MESSAGE_SUBJECT, subject); 

intent.putExtra(Messaging.KEY_ACTION_SENDTO_MESSAGE_BODY, body); 

intent.putExtra(Messaging.KEY_ACTION_SENDTO_CONTENT_URI, sb.toString()); 

intent.putExtra(Messaging.KEY_ACTION_SENDTO_COMPOSE_MODE, composeMode); 

intent.putExtra(Messaging.KEY_ACTION_SENDTO_EXIT_ON_SENT, exitOnSent); 

startActivity(intent); 

9.发送Email 

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

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

startActivity(it); 

Intent it = new Intent(Intent.ACTION_SEND);    

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

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

it.setType("text/plain");    

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

Intent it=new Intent(Intent.ACTION_SEND);      

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

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

it.putExtra(Intent.EXTRA_EMAIL, tos);      

it.putExtra(Intent.EXTRA_CC, ccs);      

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

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

it.setType("message/rfc822");      

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

Intent it = new Intent(Intent.ACTION_SEND);    

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

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

sendIntent.setType("audio/mp3");    

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

10.播放多媒体   

Intent it = new Intent(Intent.ACTION_VIEW); 

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

it.setDataAndType(uri, "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); 

获取能播放音乐的程序:

Intent intent = new Intent("android.intent.action.VIEW");

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

intent.putExtra("oneshot", 0);

intent.putExtra("configchange", 0);

Uri uri = Uri.fromFile(new File(param)); // 通过file文件去获得content的uri

intent.setDataAndType(uri, "audio/*");

startActivity(intent ); 

11.安装apk 

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

Intent It = new Intent(Intent.ACTION_PACKAGE_ADDED, uri); 

startActivity(It);

 

获取能够打开apk的程序

Intent intent = new Intent("android.content.Intent.ACTION_VIEW");

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

Uri uri = Uri.fromFile(new File(param));

intent.setDataAndType(uri, "application/vnf.android.package-archive");

12.卸载apk 

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

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

startActivity(it);

13. 打开照相机 
    <1>Intent i = new Intent(Intent.ACTION_CAMERA_BUTTON, null); 

           this.sendBroadcast(i); 

     <2>long dateTaken = System.currentTimeMillis(); 

            String name = createName(dateTaken) + ".jpg"; 

            fileName = folder + name; 

            ContentValues values = new ContentValues(); 

            values.put(Images.Media.TITLE, fileName); 

            values.put("_data", fileName); 

            values.put(Images.Oedia.PICASA_ID, fileName); 

            values.put(Images.Media.DISPLAY_NAME, fileName); 

            values.put(Images.Media.DESCRIPTION, fileName); 

            values.put(Images.ImageColumns.BUCKET_DISPLAY_NAME, fileName); 

            Uri photoUri = getContentResolver().insert( 

                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 

             

            Intent inttPhoto = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

            inttPhoto.putExtra(MediaStore.EXTRA_OUTPUT, photoUri); 

            startActivityForResult(inttPhoto, 10); 

14.从gallery选取图片 

  Intent i = new Intent(); 

            i.setType("image/*"); 

            i.setAction(Intent.ACTION_GET_CONTENT); 

            startActivityForResult(i, 11); 

15. 打开录音机 

   Intent mi = new Intent(Media.RECORD_SOUND_ACTION); 

            startActivity(mi); 

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

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

startActivity(it); 

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

18打开联系人列表 

   '3B         <1>            

           Intent i = new Intent(); 

           i.setAction(Intent.ACTION_GET_CONTENT); 

           i.setType("vnd.android.cursor.item/phone"); 

           startActivityForResult(i, REQUEST_TEXT); 

            <2> 

            Uri uri = Uri.parse("content://contacts/people"); 

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

            startActivityForResult(it, REQUEST_TEXT); 

19 打开另一程序 

Intent i = new Intent(); 

            ComponentName cn = new ComponentName("com.yellowbook.android2", 

                    "com.yellowbook.android2.AndroidSearch"); 

            i.setComponent(cn); 

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

            startActivityForResult(i, RESULT_OK); 

20.调用系统编辑添加联系人(高版本SDK有效):

Intent it = newIntent(Intent.ACTION_INSERT_OR_EDIT);

               it.setType("vnd.android.cursor.item/contact");

                //it.setType(Contacts.CONTENT_ITEM_TYPE);

                it.putExtra("name","myName");

               it.putExtra(android.provider.Contacts.Intents.Insert.COMPANY,  "organization");

               it.putExtra(android.provider.Contacts.Intents.Insert.EMAIL,"email");

                it.putExtra(android.provider.Contacts.Intents.Insert.PHONE,"homePhone");

                it.putExtra(android.provider.Contacts.Intents.Insert.SECONDARY_PHONE,

                               "mobilePhone");

                it.putExtra(  android.provider.Contacts.Intents.Insert.TERTIARY_PHONE,

                               "workPhone");

               it.putExtra(android.provider.Contacts.Intents.Insert.JOB_TITLE,"title");

                startActivity(it);

 

21.调用系统编辑添加联系人(全有效):

Intent intent = newIntent(Intent.ACTION_INSERT_OR_EDIT);

           intent.setType(People.CONTENT_ITEM_TYPE);

           intent.putExtra(Contacts.Intents.Insert.NAME, "My Name");

           intent.putExtra(Contacts.Intents.Insert.PHONE, "+1234567890");

           intent.putExtra(Contacts.Intents.Insert.PHONE_TYPE,Contacts.PhonesColumns.TYPE_MOBILE);

           intent.putExtra(Contacts.Intents.Insert.EMAIL, "com@com.com");

           intent.putExtra(Contacts.Intents.Insert.EMAIL_TYPE,                    Contacts.ContactMethodsColumns.TYPE_WORK);

           startActivity(intent);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android