显式intent和隐式intent的差别

  • Post author:
  • Post category:其他




显式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 版权协议,转载请附上原文出处链接和本声明。