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

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

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


最后我们来写启动的代码

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字段


    
        
         //随意的字符串都行
    

然后到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:

在app1中的MainActivity.java中添加:

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

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


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

 //是否导出

先运行一下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:


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


    
        
        
    


    
        
        
    

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


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


    
        
        
         // 新的匹配项
    

运行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概念及应用)