显式intent和隐式intent的差别

显式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文件,默认是接受的,从
看出来的,问题得到解决。

 35        
 36                 android:configChanges="orientation|keyboardHidden|screenSize"
 37                 android:excludeFromRecents="true">
 38            
 39                
 40                
 41                 
 42                
 43                
 44                
 45            
 46            
 47                
 48                 
 49                
 50                
 51                
 52            
 53            
 54                
 55                 
 56            
 57        

那如何拒绝外来intent启动自己呢,只要在Activity的属性中配置exported=“false”即可,比如下面:
 59        
 60                 android:configChanges="orientation|keyboardHidden|screenSize"
 61                 android:exported="false" />
这样当有人试图通过intent启动自己时,是无法达到目的的。

你可能感兴趣的:(android系统)