通常,我们开发一个app时,都会注册启动Activity,方法如下:
<activity android:name="cn.czl.myapplication.StartActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
这样会在主页创建一个图标,点击即可进入应用。有时候我们并不希望这种效果,比如支付宝安全支付服务。实现这种效果很简单,注释掉intent-filter就好了。
<activity android:name="cn.czl.myapplication.StartActivity">
<!--<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>-->
</activity>
运行,出现Default Activity not found
错误。
这是因为,没有默认Activity就无法启动,所以不能以常规方式安装运行。
- 使用命令行生成apk
gradlew -p myapplication assemble
- 使用adb命令安装apk
C:\Users\LENOVO>adb install *\myapplication-debug.apk
显示success后,我们在手机的应用管理里面,就可以看到我们安装的应用了。
然后我们可以从另外一个应用显示调用它:
findViewById(R.id.tv).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClassName("cn.czl.myapplication", "cn.czl.myapplication.MainActivity");
startActivity(intent);
}
});
运行,报错:
03-19 09:05:54.027 3078-3078/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: cn.czl.myapplication1, PID: 3078
java.lang.SecurityException: Permission Denial: starting Intent { cmp=cn.czl.myapplication/.MainActivity } from ProcessRecord{b5b18f2 3078:cn.czl.myapplication1/u0a260} (pid=3078, uid=10260) not exported from uid 10261
at android.os.Parcel.readException(Parcel.java:1945)
at android.os.Parcel.readException(Parcel.java:1891)
at android.app.IActivityManager$Stub$Proxy.startActivity(IActivityManager.java:4365)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1631)
at android.app.Activity.startActivityForResult(Activity.java:4741)
at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:67)
at android.app.Activity.startActivityForResult(Activity.java:4681)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:720)
at android.app.Activity.startActivity(Activity.java:5102)
at android.app.Activity.startActivity(Activity.java:5070)
at cn.czl.myapplication.StartActivity$1.onClick(StartActivity.java:21)
at android.view.View.performClick(View.java:6291)
at android.view.View$PerformClick.run(View.java:24931)
at android.os.Handler.handleCallback(Handler.java:808)
at android.os.Handler.dispatchMessage(Handler.java:101)
at android.os.Looper.loop(Looper.java:166)
at android.app.ActivityThread.main(ActivityThread.java:7380)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:926)
主要看这一句
java.lang.SecurityException: Permission Denial: starting Intent { cmp=cn.czl.myapplication/.MainActivity } from ProcessRecord{b5b18f2 3078:cn.czl.myapplication1/u0a260} (pid=3078, uid=10260) not exported from uid 10261
提示不能从不同的uid去调用。
解决方案
给被调用Activity添加android:exported="true"
属性
<activity
android:name=".MainActivity"
android:exported="true"/>