无主Activity的后台应用开发与调用

通常,我们开发一个app时,都会注册启动Activity,方法如下:

        
            
                

                
            
        

这样会在主页创建一个图标,点击即可进入应用。有时候我们并不希望这种效果,比如支付宝安全支付服务。实现这种效果很简单,注释掉intent-filter就好了。

        
            
        

运行,出现Default Activity not found错误。

Default Activity not found

这是因为,没有默认Activity就无法启动,所以不能以常规方式安装运行。

  • 使用命令行生成apk gradlew -p myapplication assemble
  • 使用adb命令安装apkC:\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的后台应用开发与调用)