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