显式intent和隐式intent的差别

比如下面413行利用显式的intent进行Activity的启动,这种显示的方式必须直接给出 PackageInstallerActivity类名,类名给出了肯定要import进包名,408行,
但是问题来了,我把包含这段代码的apk放到android源码中去编译时,发现会编译失败,为什么?因为 PackageInstallerActivity是在android/packages/app/目录中,
属于外部第三方程序(不管是别人开发的还是google开发的),而源码编译时只能识别framework中的内容,这里使用到了framework以外的内容,故编译失败:
408   import com.android.packageinstaller.PackageInstallerActivity;
409     private void installApk(String file) {
410         Intent intent = new Intent();
413         intent.setClass(getActivity(), PackageInstallerActivity.class);
416         intent.setDataAndType(Uri.fromFile(new File(file)), "application/vnd.android.package-archive");
417         startActivity(intent);
418     }

那修改的方法其实很简单,就是将显式intent改为隐式intent即可:
409     private void installApk(String file) {
410         Intent intent = new Intent();
415         intent.setAction(" android.intent.action.INSTALL_PACKAGE ");
416         intent.setDataAndType(Uri.fromFile(new File(file)), "application/vnd.android.package-archive");
417         startActivity(intent);
418     }
由于没有直接用到 PackageInstallerActivity 这个类,也就无需import包名,跟外界撇清了关系,只要 PackageInstallerActivity默认接收外来intent调用即可,
看了一下, PackageInstallerActivity的AndroidMenifest.xml文件,默认是接受的,从 <category android:name="android.intent.category.DEFAULT" />
看出来的,问题得到解决。

 35         <activity android:name=".PackageInstallerActivity"
 36                 android:configChanges="orientation|keyboardHidden|screenSize"
 37                 android:excludeFromRecents="true">
 38             <intent-filter>
 39                 <action android:name="android.intent.action.VIEW" />
 40                 <action android:name="android.intent.action.INSTALL_PACKAGE" />
 41                 <category android:name="android.intent.category.DEFAULT" />
 42                 <data android:scheme="file" />
 43                 <data android:scheme="content" />
 44                 <data android:mimeType="application/vnd.android.package-archive" />
 45             </intent-filter>
 46             <intent-filter>
 47                 <action android:name="android.intent.action.INSTALL_PACKAGE" />
 48                 <category android:name="android.intent.category.DEFAULT" />
 49                 <data android:scheme="file" />
 50                 <data android:scheme="package" />
 51                 <data android:scheme="content" />
 52             </intent-filter>
 53             <intent-filter>
 54                 <action android:name="android.content.pm.action.CONFIRM_PERMISSIONS" />
 55                 <category android:name="android.intent.category.DEFAULT" />
 56             </intent-filter>
 57         </activity>

那如何拒绝外来intent启动自己呢,只要在Activity的属性中配置exported=“false”即可,比如下面:
 59         <activity android:name=".InstallAppProgress"
 60                 android:configChanges="orientation|keyboardHidden|screenSize"
 61                 android:exported="false" />
这样当有人试图通过intent启动自己时,是无法达到目的的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值