• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
戈瑾
博客园    首页    新随笔    联系   管理    订阅  订阅
Android学习——隐式Activity

使用隐式的Intent

含蓄,不指名道姓,不会指明那个Activity必须被哪个Activity所启动。

一个Activity2如何被另一个Activity1所启动,关键取决于AndroidManifest.xml中对于Activity2定义的两个标签的信息,分别是action和category。

1 <activity android:name=".SecondActivity">
2     <intent-filter>
3         <action android:name="android.bignerdranch.activitytest.ACTION_START" />
4         <category android:name="android.intent.category.DEFAULT" />
5     </intent-filter>
6 </activity>

 

然后使用另一个的构造函数Intent(String str)来创建隐式的Intent:

1  button1.setOnClickListener(new View.OnClickListener(){
2      @Override
3      public void onClick(View v) {
4          Intent intent = new Intent("android.bignerdranch.activitytest.ACTION_START");
5          startActivity(intent);
6      }
7  });

 

以上代码创建的Intent对象,用它启动Activity,启动的是能够响应"android.bignerdranch.activitytest.ACTION_START"这个action的活动,由于SecondActivity的category指定为默认,因此是可以匹配的,可以成功启动SecondActivity。

【注意】:每个Intent只能指定一个action,但却能指定多个category。

如果intent对象中多指定一个category,那么,这个intent就无法启动SecondActivity了:

1 button1.setOnClickListener(new View.OnClickListener(){
2      @Override
3      public void onClick(View v) {
4          Intent intent = new Intent("android.bignerdranch.activitytest.ACTION_START");
5          intent.addCategory("android.bignerdranch.activitytest.MY_CATEGORY");
6          startActivity(intent);
7      }
8  });

 

这样一来,使用startActivity(intent)启动一个Activity,没有一个Activity与它匹配,程序就会闪退。

出现运行时异常:android.content.ActivityNotFoundException:No Activity found to handle Intent

解决异常:在安卓总配置文件的<intent-filter>标签中再添加一个category声明:

 1 <activity android:name=".SecondActivity">
 2 
 3     <intent-filter>
 4 
 5         <action android:name="android.bignerdranch.activitytest.ACTION_START" />
 6 
 7         <category android:name="android.intent.category.DEFAULT" />
 8 
 9         <category android:name="android.bignerdranch.activitytest.MY_CATEGORY" />
10 
11     </intent-filter>
12 
13 </activity>

 

 

隐式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>1234567891011121314151617181920212223242526272829303132333435363738注意看 30 和 31行,是我新加的两行代码
<intent-filter >                <category android:name="android.intent.category.DEFAULT"/>                <action android:name="com.example.intent.BMainActivity" /></intent-filter>1234category 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"));            }        });    }12345678910111213new 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>————————————————版权声明:本文为CSDN博主「GP0071」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/gaopeng0071/article/details/45077203

posted on 2021-04-13 19:25  戈瑾  阅读(192)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3