受欢迎的博客标签

Android|Android Studio| Intent Example And Code

Published

 

1.Android中 intent 显式启动与隐式启动

1.1 显式启动代码

显式Intent:通过指定Intent组件名称来实现,用new Intent(A.this,B.class)指明需要转向到的Activity。

FirstActivity.java

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.first_layout);
    Button button1 = (Button) findViewById(R.id.button_1);
    button1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //Toast.makeText(FirstActivity.this,"哈哈",Toast.LENGTH_SHORT).show();
            Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
            startActivity(intent);
        }
    });

}

https://blog.csdn.net/luohai859/article/details/7368745

 

//显式Intent写法为:
Uri uri=Uri.parse("app://test");
Intent intent=new Intent(Intent.ACTION_VIEW,uri);
startActivity(intent);

 

1.android.intent.category.DEFAUL 是一种默认的category,在调用startActivity()方法的时候会自动将这个category添加到intent中

//不加下面这行也行,因为intent的这个属性默认值即系Intent.CATEGORY_DEFAULT

intent.addCategory(Intent.CATEGORY_DEFAULT);

 

1.2 隐式启动代码


清单文件-AndroidManifest.xml

清单文件注册Activity

隐式启动不同之处在于我们并不需要像Intent(MainActivity.this, SecondActivity.class)这样传参数然后再Start另一个Activity.我们需要在intent添加过滤器intentfilter。

隐式Intent:通过在清单文件中配置IntentFilter来实现。Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。

在不同应用程序之间,如果想隐式intent不可以被跨应用启动只需要在AndroidManifest.xml对应的activity中配置android:exported="false"即可。

需要在intent添加过滤器intentfilter。

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

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".SecondActivity">
        <intent-filter>
            <action android:name="com.example.deligence.ACTION_START"/>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
    </activity>
</application>

隐式启动Activity的intent到底发给哪个activity,需要进行三个匹配,一个是action,一个是category,一个是data,可以是全部或部分匹配。

(同样适用于Service和BroadcastReceiver)

<action> 标签中我们指明了当前活动可以响应com.example.deligence.ACTION_START

<category>标签包含了一些附加信息,更精确地表明了当前活动能够响应的Intent中还可能带有的category.

只有<action>和<category>中的内容
能同时匹配上intent指定的action和category时,这个活动才能响应改intent

 

1.任何一个需要隐式启动的Activity都必须要有这项android.intent.category.DEFAULT:

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

例外情况:android.intent.category.MAIN和android.intent.category.LAUNCHER的filter中没有必要加入android.intent.category.DEFAULT,当然加入也没有问题

 
FirstActivity.java
 

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.first_layout);
    Button button1 = (Button) findViewById(R.id.button_1);
    button1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent("com.example.deligence.ACTION_START");
            startActivity(intent);
        }
    });

}

 

 

 

Useful links

https://abhiandroid.com/programming/intent-filter

https://www.tutorialspoint.com/android/android_intents_filters.htm