zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Linux Network Related Drive
    Deformity ASP/ASPX Webshell、Webshell Hidden Learning
    PostgreSQL Reading Ad Writing Files、Execution System Instructions Vul
    Linux下修改进程名称
    karottc A Simple linux-virus Analysis、Linux Kernel <= 2.6.37
    python grammar、C/C++ Python Parsing Engine
    Java unserialize serialized Object(AnnotationInvocationHandler、ysoserial) In readObject() LeadTo InvokerTransformer(Evil MethodName/Args)
    Redis未授权访问漏洞分析
    Automated CMS category, version identification (CMS vulnerability detection)
    Linux process authority、the security risks in running process with high authority
  • 原文地址:https://www.cnblogs.com/znjy/p/14907771.html
Copyright © 2011-2022 走看看