第三篇 隐式Intent(同一应用和不同应用之间)

一、同一个应用,如何使用隐式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) {
                //通过另一个应用Activityaction属性来启动

                //                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();
                }
                //这样当,启动不成功的时候,我们就再当前界面给个小提示
            }
        });
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值