zoukankan      html  css  js  c++  java
  • Android PackageInstaller 安装和卸载

    应用的安装方式:adb install或者下载安装

    过程分析请參考老罗的blog,这里记录一下第三方应用程序安装apk的过程。

    安装的过程主要是调用PackageInstaller这个App,源码的位置在package/app/PackageInstaller

    AndroidManifest.xml例如以下,

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
              package="com.android.packageinstaller">
    
        <original-package android:name="com.android.packageinstaller" />
    
        <uses-permission android:name="android.permission.INSTALL_PACKAGES" />
        <uses-permission android:name="android.permission.DELETE_PACKAGES" />
        <uses-permission android:name="android.permission.CLEAR_APP_CACHE" />
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <uses-permission android:name="android.permission.CLEAR_APP_USER_DATA" />
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.MANAGE_USERS" />
        <application android:label="@string/app_name"
                android:allowBackup="false"
                android:theme="@android:style/Theme.DeviceDefault.DialogWhenLarge.NoActionBar">
            <activity android:name=".PackageInstallerActivity"
                    android:configChanges="orientation|keyboardHidden|screenSize"
                    android:excludeFromRecents="true">
                <intent-filter>
                    <action android:name="android.intent.action.VIEW" />
                    <action android:name="android.intent.action.INSTALL_PACKAGE" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <data android:scheme="file" />
                    <data android:mimeType="application/vnd.android.package-archive" />
                </intent-filter>
                <intent-filter>
                    <action android:name="android.intent.action.INSTALL_PACKAGE" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <data android:scheme="file" />
                    <data android:scheme="package" />
                </intent-filter>
            </activity>
            <activity android:name=".InstallAppProgress"
                    android:configChanges="orientation|keyboardHidden|screenSize">
            </activity>
            <activity android:name=".UninstallerActivity"
                    android:configChanges="orientation|keyboardHidden|screenSize"
                    android:excludeFromRecents="true"
                    android:theme="@android:style/Theme.DeviceDefault.Dialog.NoActionBar">
                <intent-filter>
                    <action android:name="android.intent.action.DELETE" />
                    <action android:name="android.intent.action.UNINSTALL_PACKAGE" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <data android:scheme="package" />
                </intent-filter>
            </activity>
            <activity android:name=".UninstallAppProgress"
                    android:configChanges="orientation|keyboardHidden|screenSize">
            </activity>
            <!--
            <receiver android:name=".RemoveReceiver">
                <intent-filter>
                    <action android:name="android.intent.action.PACKAGE_FULLY_REMOVED" />
                    <data android:scheme="package" />
                </intent-filter>
            </receiver>
            -->
        </application>
    </manifest> 

    安装和卸载APP主要用到了PackageInstallerActivity和UninstallActivity。

    安装一个应用程序的步骤例如以下:

    String fileName = Environment.getExternalStorageDirectory() + "/myApp.apk";   
    Intent intent = new Intent(Intent.ACTION_VIEW);   
    intent.setDataAndType(Uri.fromFile(new File(fileName)), "application/vnd.android.package-archive");   
    startActivity(intent); 

    卸载一个应用程序的步骤例如以下:

    Uri packageURI = Uri.parse("package:com.android.myapp");   
    Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);   
    startActivity(uninstallIntent);  

    默认是不支持非市场安装的,这里可推断一下:

    int result = Settings.Secure.getInt(getContentResolver(),
     Settings.Secure.INSTALL_NON_MARKET_APPS, 0);   
    if (result == 0) {   
    // show some dialog here   
    // ...   
    // and may be show application settings dialog manually   
    Intent intent = new Intent();   
    intent.setAction(Settings.ACTION_APPLICATION_SETTINGS);   
    startActivity(intent);   
    } 




  • 相关阅读:
    vs15
    Areas(区域)
    池编程技术
    MyBitis(iBitis)系列随笔之五:多表(一对多关联查询)
    MyBatis学习总结(五)——实现关联表查询
    Mapper映射语句高阶应用——ResultMap
    mysql中的null字段值的处理及大小写问题
    spring-boot支持双数据源mysql+mongo
    No resource identifier found for attribute 'showAsAction' in package 'android'
    No resource found that matches the given name 'Theme.AppCompat.Light'.
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4363390.html
Copyright © 2011-2022 走看看