一、同一个应用,如何使用隐式Intent?
即,在要启动的目标Activity标签中,增加<intent-filter> <category android:name = "android.intent.category.DEFAULT"/> <action android:name="包名.intent.action.类名"/></intent-filter>
具体应用如下:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btnMyAty).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//一、显式Intent,Intent就是意图的意思,第二个参数代表指定要启动的目标类,可以看到已经是确定的了。
// startActivity(new Intent(MainActivity.this,MyAty.class));
//二、隐式Intent,通过在AndroidManifest.xml中配置intent-filter设置action,然后调用startActivity()的重载方法,直接把action传递进来
// startActivity(new Intent("com.jkxy.xsintent.intent.action.MyAty"));
//三、隐式Intent,在要启动的Activity中,指定一个公有的类变量存储action,然后直接通过 类名.变量名,传递action 这样可以避免字符串太长输入错误
startActivity(new Intent(MyAty.ACTION));
//四、隐式Intent,不同的应用之间我们不知道要启动的类名是啥东西,可以通过action来启动
}
});
}
}
public class MyAty extends AppCompatActivity {
public final static String ACTION = "com.jkxy.xsintent.intent.action.MyAty";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_aty);
}
}
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".MyAty" android:exported="false">
<!--隐式intent-->
<intent-filter>
<category android:name="android.intent.category.DEFAULT"/>
<!--一般写成:包名.intent.action.类名-->
<action android:name="com.jkxy.xsintent.intent.action.MyAty"/>
</intent-filter>
</activity>
二、在另一个应用里面启动上面应用里面的MyAty,需要注意的是,通过设置要启动的目标Activity的属性
android:exported = false 就可以阻止其他的应用来访问当前应用的Activity了
public class MainActivity extends AppCompatActivity {
private String ato_action = "com.jkxy.xsintent.intent.action.MyAty";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btnAtyApp).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//通过另一个应用Activity的action属性来启动
// startActivity(new Intent(ato_action));
//那么如何不让其他应用来启动ato_action呢?就是在另一个应用的Activtiy中,设置不导出exproted<activity
// android:name=".MyAty" android:exported="false"> 然后重新安装两个应用,在当前应用点击按钮,就会报错
//java.lang.SecurityException: Permission Denial: starting Intent { act=com.jkxy
// .xsintent.intent.action.MyAty cmp=com.jkxy.xsintent/.MyAty } from
// ProcessRecord{b5a0f7b8 2093:com.jkxy.app1/u0a46} (pid=2093, uid=10046) not
// exported from uid 10045
//当然,我们可以使用异常处理的方法,来给用户一个提示
try { startActivity(new Intent(ato_action));
} catch (Exception e){
Toast.makeText(MainActivity.this,"不能启动另一个应用",Toast.LENGTH_LONG).show();
}
//这样当,启动不成功的时候,我们就再当前界面给个小提示
}
});
}
}