美文网首页
Android基础知识—Intent概念及应用

Android基础知识—Intent概念及应用

作者: wshlin | 来源:发表于2016-03-27 21:59 被阅读202次

    Intent 是 Android 开发中的非常重要的基础概念

    1. 显示Intent

    首先手动创建一个类,然后让它继承至Activity.之后给它绑定一个视图,之后在AndroidMainfest进行Intent的配置

    public class MyAty extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.myaty);
        }
    }
    

    新建一个布局

    myaty.xml
    

    回到MainActivity,给它的布局添加一个button

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Start MyAty"
        android:id="@+id/btnStartMyAty"
        android:layout_below="@+id/textView"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />
    

    接下来到AndroidMainfest.xml注册MyAty就可以使用Intent了.

    <activity android:name=".MyAty"/>
    

    最后我们来写启动的代码

    MainActivity.java
    findViewById(R.id.btnStartMyAty).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActivity(new Intent(MainActivity.this, MyAty.class));
        }
    });
    

    2. 隐式Intent

    通过在AndroidMainfest.xml配置intent-filter字段

    <activity android:name=".MyAty">
        <intent-filter>
            <category android:name="android.intent.category.DEFAULT"/>
            <action android:name="wshlinlalala"/> //随意的字符串都行
        </intent-filter>
    </activity>
    

    然后到MainActivity.java修改:

    startActivity(new Intent("whlinlalala"));
    

    使用约定熟成的格式,上面一同改:

    startActivity(new Intent("com.lin.learnintent.intent.action.MyAty"));
    

    更好的实现,在被启动的activity添加一个静态的字符串常量:

    MyAty.java
    public class MyAty extends Activity {
        public static final String ACTION = "com.lin.learnintent.intent.action.MyAty";
        @Override
        ...
    } 
    
    MainActivity.java
    startActivity(new Intent(MyAty.ACTION));
    

    接下来在创建一个应用app1,new Module在同个工程里就多了个app1.
    在app1中的activity_main.xml添加一个button:

    <Button
        android:text="Start MyAty From App1"
        android:id="@+id/btnStartMyAty"/>
    

    在app1中的MainActivity.java中添加:

    startActivity(new Intent("com.lin.learnintent.intent.action.MyAty"));
    

    启动app1,看能不能成功启动另一个应用的MyAty呢?
    答案是可以的,这种隐式Intent配置的是可以跨应用来启动activity的.


    但如果说你的一个activity只允许在同一个程序内部来访问,不允许其他应用来访问的话,该如何去配置呢?
    在app的AndroidMainfest.xml中进行配置

    <activity android:name=".MyAty" android:exported="false"> //是否导出
    

    先运行一下app,在运行app1.此时出现错误,程序退出.
    接下来捕获异常做些处理:

    app1中的MainActivity.java
    public void onClick(View v) {
        try {
            startActivity(new Intent("com.lin.learnintent.intent.action.MyAty"));
        }catch(Exception e){ //捕获任意的异常
            Toast.makeText(MainActivity.this, "无法启动指定的Activity", Toast.LENGTH_SHORT).show();
        }
    }
    

    3. Intent过滤器相关选项

    如果说有多个Activity拥有同样的IntentAction的话,那么在启动的时候使用同一个Action来启动的话,它又是什么情况呢?


    在app中新建一个空白的Activity:MyAty1.修改一下activity_my_aty1.xml:

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="MyAty1" />
    

    此时去到AndroidMainfest可以看到已经添加了注册了,修改:
    先把之前MyAty的activity的exported去掉

    <activity
        android:name=".MyAty"
        android:label="MyAty">
        <intent-filter>
            <category android:name="android.intent.category.DEFAULT" />
            <action android:name="com.lin.learnintent.intent.action.MyAty" />
        </intent-filter>
    </activity>
    <activity
        android:name=".MyAty1"
        android:label="MyAty1">
        <intent-filter>
            <category android:name="android.intent.category.DEFAULT" />
            <action android:name="com.lin.learnintent.intent.action.MyAty" />
        </intent-filter>
    </activity>
    

    此时可以看出两个Activity使用的是同一个action。
    运行一下app,在运行app1。
    点击Button发现会提示我们选择要使用的应用:MyAtyorMyAty1,随便点击一个进入相应的activity。
    如果点击了always,将永远使用那个,不再弹出对话框了。如果想清除的话,进入手机设置到应用信息下的CLEAR DEFAULTS。


    其他的匹配
    启动时,指明一个activity。
    修改app中的AnroidMainfest.xml:

    <activity
        android:name=".MyAty1"
        android:label="MyAty1">
        <intent-filter>
            <category android:name="android.intent.category.DEFAULT" />
            <action android:name="com.lin.learnintent.intent.action.MyAty" />
            <data android:scheme="app"/> // 新的匹配项
        </intent-filter>
    </activity>
    

    运行app,回到app1里边修改使应用指向MyAty1

    MainActivity.java
    findViewById(R.id.btnStartMyAty).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            try {
                startActivity(new Intent("com.lin.learnintent.intent.action.MyAty", Uri.parse("app://hello"))); // 后边参数任意比如hello
            }catch(Exception e){
                Toast.makeText(MainActivity.this, "无法启动指定的Activity", Toast.LENGTH_SHORT).show();
            }
        }
    });
    

    运行app1,此时点击Button就不会弹出提示框了。它是能够启动到我们指明协议的activity。
    除此之外,所配置的data选项还有其他的一些可匹配的参数。

    相关文章

      网友评论

          本文标题:Android基础知识—Intent概念及应用

          本文链接:https://www.haomeiwen.com/subject/wlljlttx.html