Android - 显示Intent与隐式Intent的应用

Android -- 显示Intent与隐式Intent的应用

前面的博客我们见到过Intent,我们通过他来指定activity之间的跳转,及数据的传递。

下面我们来了解下Intent,Intent在我们的应用中分为显示和隐式两种方式。

显示Intent

见下面这段程序

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                startActivity(new Intent(MainActivity.this, BMainActivity.class));
            }
        });
    }

看完是不是感觉很熟悉,这里的Intent(MainActivity.this, BMainActivity.class)就是显示Intent的用法,直接指定从哪跳转到哪。

隐式Activity

隐式的Activity正如名字一样,一些信息是隐秘的,我们来看看AndroidManifest.xml这个配置文件,它是用于捆绑Activity和视图的配置文件,就像jsp servlet一样。
1、我们来看下他的配置

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.intent"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".BMainActivity"
            android:label="@string/title_activity_bmain" >

            <intent-filter >
                <category android:name="android.intent.category.DEFAULT"/>
                <action android:name="com.example.intent.BMainActivity" />
            </intent-filter>

        </activity>
    </application>

</manifest>

注意看 30 和 31行,是我新加的两行代码

<intent-filter >
                <category android:name="android.intent.category.DEFAULT"/>
                <action android:name="com.example.intent.BMainActivity" />
</intent-filter>

category android:name=”android.intent.category.DEFAULT”指定Intent跳转的方式为默认,默认为Activity间的跳转。
action android:name=”com.example.intent.BMainActivity”,指定Activity的名字(别名)

2、我们来看看代码是怎么样隐式表达的。

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                startActivity(new Intent("com.example.intent.BMainActivity"));
            }
        });
    }

new Intent(“com.example.intent.BMainActivity”),直接用在AndroidManifest.xml定义的别名来进行activity之间的跳转。

3、这么用有个优点,就是可以跨应用跳转,就是我可以从一个baidu应用,跳转到一个QQ音乐应用的Activity里,瞬间感觉这个隐式Intent不错吧。我们经常在应用中见到。
所以有一点指的我们注意,那就是配置文件中,别名的命名规则,采取应用包名+activity名保证唯一。

4、如果我们不想对其他应用开放某个activity,那么通过配置接口实现。activity配置中增加android:exported=”false”,默认为true。

        <activity
            android:name=".BMainActivity"
            android:label="@string/title_activity_bmain"
            android:exported="false" >

            <intent-filter >
                <category android:name="android.intent.category.DEFAULT"/>
                <action android:name="com.example.intent.BMainActivity" />
            </intent-filter>

        </activity>