需求:在没有操作屏的设备上,通过手机连接设备发送命令可以触发应用升级,但升级过程中需要不断点击弹出的确认、安装、允许等命令,需默认允许所有弹窗、使手机发送命令后整个安装过程能自动完成并自动重新打开升级后的应用。

原理

Android 默认的安装应用的系统应用为 PackageInstaller,首先确定平台源码没有裁剪该应用,然后修改该应用 onResume 时的相关处理。自动重新打开升级后的应用有专门的一个类 InstallSuccess 专门负责后续操作。具体原理流程待研究、具体修改方法如下。

修改方法

// packages/apps/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java....public class PackageInstallerActivity extends OverlayTouchActivity implements OnClickListener {...@Overrideprotected void onResume() {super.onResume();if (mOK != null) {mOk.setEnabled(mEnableOk);}// Added by Enoch : application upgrade slientlyif (mOkCanInstall || mScrollView == null) {if (mSessionId != -1) {mInstaller.setPermissionsResult(mSessionId, true);finish();}} else {mScrollView.pageScroll(View.FOCUS_DOWN);}// Added end.}...}....
// packages/apps/PackageInstaller/src/com/android/packageinstaller/InstallSuccess.java...public class InstallSuccess extends Activity {...@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);if (getIntent().getBooleanExtra(Intent.EXTRA_RETURN_RESULT, false)) {...} else {...// Enable or disable "launch" button            Intent launchIntent = getPackageManager().getLaunchIntentForPackage(                    appInfo.packageName);            boolean enabled = false;            if (launchIntent != null) {                List<ResolveInfo> list = getPackageManager().queryIntentActivities(launchIntent,                        0);                if (list != null && list.size() > 0) {                    enabled = true;                }            }            Button launchButton = (Button)findViewById(R.id.launch_button);            if (enabled) {                launchButton.setOnClickListener(view -> {                    try {                        startActivity(launchIntent);                    } catch (ActivityNotFoundException | SecurityException e) {                        Log.e(LOG_TAG, "Could not start activity", e);                    }                    finish();                });                // Added by Enoch : autolaunch application after upgrading                try {                    startActivity(launchIntent);                } catch (ActivityNotFoundException | SecurityException e) {                    Log.e(LOG_TAG, "Could not start activity", e);                }                finish();                // Added end.            } else {                launchButton.setEnabled(false);}}...}

更多相关文章

  1. android不在坑系列一:数据库框架的选择
  2. Android(安卓)Studio获取开发版SHA1值和发布版SHA1值的史上最详
  3. android使用adb向AS自带虚拟机里安装apk
  4. Android项目管理之数据库升级策略
  5. Qt android 设置系统状态栏为全透明,半透明、全屏,设置状态栏颜色,
  6. android 字体样式
  7. android Junit demo
  8. Android:ERROR: Cause: com.android.build.gradle.internal.ide.D
  9. Android(安卓)Calendar的学习与运用【转】

随机推荐

  1. Android(安卓)QQ第三方登录
  2. Android(安卓)onPause和onSaveInstanceSt
  3. Android事件分发机制——View(一)
  4. Android:TabLayout向上滑动停留页面顶部
  5. Android点击WebView中的图片查看大图
  6. Android——Framework Resource添加使用
  7. 【Android动画九章】-AlphaAnimation(渐变
  8. 简单介绍安卓的五大布局
  9. Android在一个app中启动其他app中的servi
  10. 新版Cordova(>4.0)编译Android(安卓)APK