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选项还有其他的一些可匹配的参数。