显式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 }
由于没有直接用到
Packa
geInstallerActivity
这个类,也就无需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启动自己时,是无法达到目的的。
版权声明:本文为lizekun2010原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。