实例一: 有三个Activity:Mai

android.intent.action.MAIN、android.intent.category.LAUNCHER

实例一:

<activity android:name=”.MainActivity” android:label=”111″>
<intent-filter> <action
android:name=”android.intent.action.MAIN” /> <category
android:name=”android.intent.category.LAUNCHER” />
</intent-filter> </activity> <activity
android:name=”.Main2Activity” android:label=”222″>
<intent-filter> <action
android:name=”android.intent.action.MAIN” /> <category
android:name=”android.intent.category.LAUNCHER” />
</intent-filter> </activity>

IntentFilter就是用于描述intent的各种属性, 比如action, category等

有三个Activity:MainActivity.java/BAcitvity.java/CActivity.java

注意一个属于 action,另一个属于 category。

一些属性设置的例子:

假设这是一个照相应用MainActivity是程序入口,BActivity和CActivity都可以处理照相的内容。

此时桌面上会有两个应用图标,一个文字为 111,另一个文字为 222。

<action android:name=”com.example.project.SHOW_CURRENT” />

在我们不会使用action的时候我们要使这个应用既可以使用BActivity照相,又能使用CActivity照相如何实现?

  • 点击 111,启动 APP,如果之前 APP 在运行,直接切换出来,否则打开
    MainActivity。
  • 点击 222,启动 APP,如果之前 APP 在运行,直接切换出来,否则打开
    Main2Activity。

<category android:name=”android.intent.category.DEFAULT” />

当然是在MainActivity中写两个Button,

这两个图标,卸载掉其中一个,另一个也自动没了。

<data android:mimeType=”video/mpeg” android:scheme=”http” . . . />

new Intent(MainActivity.this,BActivity.class);

  • action.MAIN 表示最先启动这个 Activity。
  • category.LAUNCHER 表示这个 Activity 在桌面上形成一个启动图标。

<data android:mimeType=”image/*” />

new Intent(MainActivity.this,CActivity.class);

一定要 action.MAIN、category.LAUNCHER 要同时都写上,只写其中一个的话,该
Activity 就不会在桌面上形成图标。

<data android:scheme=”http” android:type=”video/*” />

通过两种不同的Intent来发起请求。

android.intent.category.DEFAULT

 

澳门新葡萄京官网首页, 

在说这个之前,先谈谈显式启动,就是用 startActivity
启动;再说说隐式启动,就是用 intent-filter 匹配启动,比如在浏览器中启动
APP,在某 APP 中启动另一个 APP。

 

那么如何使用action来实现呢?

如果要实现隐式启动,就得指定 android.intent.category.DEFAULT。

 

在xml中先这样定义:

关于IntentFilter的几点注意事项

[html]

(1).android.intent.action.MAIN 与 android.intent.category.LAUNCHER

<activity 
    android:name=”.MainActivity” 
    android:label=”@string/title_activity_main” > 
    <intent-filter> 
        <action android:name=”android.intent.action.MAIN” /> 
 
        <category android:name=”android.intent.category.LAUNCHER”
/> 
    </intent-filter> 
</activity> 
 
<activity 
    android:name=”.BActivity” 
    android:label=”@string/title_activity_main” 
    android:launchMode=”singleTask” > 
    <intent-filter> 
        <action
android:name=”com.h3c.intent.ACTION_VIEW”></action>   
        <category
android:name=”android.intent.category.DEFAULT”></category>  
    </intent-filter> 
</activity> 
 
<activity 
    android:name=”.CActivity” 
    android:label=”@string/title_activity_main” > 
    <intent-filter> 
        <action
android:name=”com.h3c.intent.ACTION_VIEW”></action>   
        <category
android:name=”android.intent.category.DEFAULT”></category>  
    </intent-filter> 
</activity> 
        <activity
            android:name=”.MainActivity”
            android:label=”@string/title_activity_main” >
            <intent-filter>
                <action android:name=”android.intent.action.MAIN”
/>

android.intent.action.MAIN决定一个应用程序最先启动那个组件

                <category
android:name=”android.intent.category.LAUNCHER” />
            </intent-filter>
        </activity>
       
        <activity
            android:name=”.BActivity”
            android:label=”@string/title_activity_main”
            android:launchMode=”singleTask” >
            <intent-filter>
                <action
android:name=”com.h3c.intent.ACTION_VIEW”></action> 
                <category
android:name=”android.intent.category.DEFAULT”></category>
            </intent-filter>
        </activity>
       
        <activity
            android:name=”.CActivity”
            android:label=”@string/title_activity_main” >
            <intent-filter>
                <action
android:name=”com.h3c.intent.ACTION_VIEW”></action> 
                <category
android:name=”android.intent.category.DEFAULT”></category>
            </intent-filter>
        </activity>
我们在MainActivity中实现一个Button,点击发送:

android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里(说白了就是是否在桌面上显示一个图标)

new Intent(“com.h3c.intent.ACTION_VIEW”);

 

此时就会弹出一个Dialog让我们自动选择是使用BActivity还是使用CActiviy了,就如前文我提到camer360的那个例子

这两个属性组合情况:

这也就是隐式intent,即发送一种类型的action,可以让所有支持该类型的activity都收到消息,然后由用户选择使用哪个activity处理。

第一种情况:有MAIN,无LAUNCHER,程序列表中无图标

 

原因:android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里 

实例二:(Android分享与接收分享)

第二种情况:无MAIN,有LAUNCHER,程序列表中无图标

自己之前其实也接触过action,但是没有自己的去想清楚。比如在做DLNA这个项目的时候需要支持第三方媒体app分享给DLNA,如何实现呢?

原因:android.intent.action.MAIN决定应用程序最先启动的Activity,如果没有Main,则不知启动哪个Activity,故也不会有图标出现

首先看看如何分享给别人:

所以这两个属性一般成对出现。

[java]
public static void shareText(Context context, String title, String text)

    Intent intent = new Intent(Intent.ACTION_SEND); 
    intent.setType(“text/plain”); 
    intent.putExtra(Intent.EXTRA_SUBJECT, title); 
    intent.putExtra(Intent.EXTRA_TEXT, text); 
    context.startActivity(Intent.createChooser(intent, title)); 

public static void shareText(Context context, String title, String text)
{
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setType(“text/plain”);
    intent.putExtra(Intent.EXTRA_SUBJECT, title);
    intent.putExtra(Intent.EXTRA_TEXT, text);
    context.startActivity(Intent.createChooser(intent, title));
}就是用上文提到的隐式intent,因为我并不知道有那些应用可以支持分享,所以我用隐式intent发起分享这一类的请求。

 

 

如果一个应用中有两个组件intent-filter都添加了android.intent.action.MAIN和

我们再看如何支持分享:

android.intent.category.LAUNCHER这两个属性, 则这个应用将会显示两个图标, 写在前面的组件先运行。

[html]
<activity android:name=”.SharePage” android:label=”分享到微博”> 
    <intent-filter> 
        <action android:name=”android.intent.action.SEND” /> 
        <category android:name=”android.intent.category.DEFAULT”
/> 
        <data android:mimeType=”image/*” /> 
    </intent-filter> 
</activity> 
<activity android:name=”.SharePage” android:label=”分享到微博”>
    <intent-filter>
        <action android:name=”android.intent.action.SEND” />
        <category android:name=”android.intent.category.DEFAULT”
/>
        <data android:mimeType=”image/*” />
    </intent-filter>
</activity>是的,使用action告诉别人我支持SEND这类隐式intent,注意必须也有这样一句话,否则运行会报错。[html]
view plaincopyprint?<category
android:name=”android.intent.category.DEFAULT” /> 
<category android:name=”android.intent.category.DEFAULT”
/>最后通过data约束一下格式。

 

 

 

大家应该跟我一样终于明白action的用法了吧!

(2).关于隐式intent

 作者:h3c4lenovo
 
 

  每一个通过 startActivity() 方法发出的隐式 Intent 都至少有一个 category,就是 “android.intent.category.DEFAULT”,所以只要是想接收一个隐式 Intent 的 Activity 都应该包括 “android.intent.category.DEFAULT” category,不然将导致 Intent 匹配失败.

 

比如说一个activity组件要想被其他组件通过隐式intent调用, 则其在manifest.xml中的声明如下:

<activity android:name=”com.gesture.QGestureListActivity”>

     <intent-filter>  

           <action android:name=”com.google.test” />

           <category android:name=”android.intent.category.DEFAULT” />

 </intent-filter> 

</activity>

 

 

(3).关于intent-filter匹配优先级

首先查看Intent的过滤器(intent-filter),按照以下优先关系查找:action->data->category

 

 

(4).android.intent.category.LAUNCHER与android.intent.category.HOME的区别

android.intent.category.LAUNCHER:android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里,就是android开机后的主程序列表。

 

android.intent.category.HOME:按住“HOME”键,该程序显示在HOME列表里。

发表评论

电子邮件地址不会被公开。 必填项已用*标注