`

android第三方应用apk安装和运行控制解决方案[转]

阅读更多

需求:
   要求让用户选择喜欢的第三方应用 下载 并通过自己的UI运行 

关键问题:
   (1)  可交互下载, 用户可取消,显示进度.................这个问题好解决 ,有很多方式,如果不会可以联系我
   (2)  安装apk
   (3)  运行安装过的应用   ...... 怎样定位应用的Activity并激活 ( 如果是自己的activity 就好办了 )


解决方案
   (1) 安装apk

    直接贴出代码 就明白
   Intent intent = new Intent(Intent.ACTION_VIEW); 
   intent.setDataAndType(Uri.fromFile(new File("/sdcard/1.apk")), "app lication/vnd.android.package-archive"); 
   startActivity(intent); 
    
   其中/sdcard/1.apk 就是要安装的apk,上面代码实际上是请求android的管理安装的activity
   如果要强制安装过程,目前我还没有找到解决方法

   (2)运行应用

   首先android有一个PackageManager,这玩意功能 很强大,功能就和它的意思一样
   
   假设:如果我们知道一个第三方Application的包的名称和Activity的名称,是否可以启动它的,答案当让市YES
   
   启动代码:
   PackageManager pm;  
   //初始化pm, 比如在activity里可以PackageManager pm = getPackageManager(); 

   PackageInfo pi = pm.getPackageInfo("包的名称", PackageManager.GET_ACTIVITIES);
   //PackageInfo  包含丰富的包的信息,这个'包的名称'是什么,在AndroidManifest.xml中有明确定义 
   //  比如 package="xxx.yyy.Portal.UI"

   ActivityInfo ai=pi.activities[0];  // ActivityInfo 同样道理 他是 Activity的信息
   //这里指向第一个包中的Activity, 大多数都是第一个Activity为启动Activity
   if(ai==null) throw new Exception(pkg+"不包含任何Activity");

   String sName=ai.name;  //这里就得到Activity的类名了

   启动它:
   Intent intent = new Intent();
   intent.setComponent(new ComponentName(pkg,sName));
   parent.startActivity(intent);

   (3)获得第三方应用的包名
     
   只要有包名,就可以启动Activity了,但是不知道名字怎么办?
   如果应用没有安装自然启动不了,只要安装了就有办法。

   方法1 :
        MyBroadcastReceiver myReceiver = new MyBroadcastReceiver();
        IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_INSTALL);
        filter.addAction(Intent.ACTION_PACKAGE_ADDED);
        filter.addDataScheme("package"); 
        registerReceiver(myReceiver, filter);
        
      监视安装,在MyBroadcastReceiver的onReceive函数里
      public void onReceive(Context arg0, Intent intent) {
                        String sPackageName=intent.getDataString();  //这个就是包名
                }
      也可以使用 AndroidManifest.xml配置来监视

   方法2 : 
      枚举所有安装的应用,根据你自己的条件筛选
      使用PackageManager的
      public abstract List<PackageInfo> getInstalledPackages (int flags) 可以获得安装应用的列表。

 

 

 

 

 

apk安装及卸载的原理及代码

this should work: 

Java:
Intent intent = new Intent(Intent.ACTION_VIEW)
intent.setDataAndType(Uri.fromFile(new File(fileName))"application/vnd.android.package-archive")
startActivity(intent);


that's because intent filter is: 
XML:
       <activity android:name=".PackageInstallerActivity"> 
            <intent-filter> 
                <action android:name="android.intent.action.VIEW" /> 
                <category android:name="android.intent.category.DEFAULT" /> 
                <data android:scheme="content" /> 
                <data android:scheme="file" /> 
                <data android:mimeType="application/vnd.android.package-archive" /> 
            </intent-filter> 
        </activity>


intent filter for uninstallation: 
XML:
       <activity android:name=".UninstallerActivity"> 
            <intent-filter> 
                <action android:name="android.intent.action.VIEW" /> 
                <action android:name="android.intent.action.DELETE" /> 
                <category android:name="android.intent.category.DEFAULT" /> 
                <data android:scheme="package" /> 
            </intent-filter> 
        </activity>

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics