Android应用实现安装后自启动的方法

和网上大多数方法一样,使用广播手段:

ACTION_PACKAGE_ADDED 一个新应用包已经安装在设备上,数据包括包名(最新安装的包程序不能接收到这个广播)

ACTION_PACKAGE_REPLACED 一个新版本的应用安装到设备,替换之前已经存在的版本

ACTION_PACKAGE_CHANGED 一个已存在的应用程序包已经改变,包括包名

ACTION_PACKAGE_REMOVED 一个已存在的应用程序包已经从设备上移除,包括包名(正在被安装的包程序不能接收到这个广播)

ACTION_PACKAGE_RESTARTED 用户重新开始一个包,包的所有进程将被杀死,所有与其联系的运行时间状态应该被移除,包括包名(重新开始包程序不能接收到这个广播)

ACTION_PACKAGE_DATA_CLEARED 用户已经清除一个包的数据,包括包名(清除包程序不能接收到这个广播)

直接思路:注册广播接收以上需要的action来实现。

但是,在安卓3.1之后,有了以下机制:

force-stop in Manage Application of Settings makes App in a stopped state!

Here is what Google describes

What is Stopped State

Starting from Android 3.1, the system's package manager keeps track of applications that are in a stopped state and provides a means of controlling their launch from background processes and other applications.

Note that an application's stopped state is not the same as an Activity's stopped state. The system manages those two stopped states separately.

Why Android Adds this

Note that the system adds FLAG_EXCLUDE_STOPPED_PACKAGES to all broadcast intents. It does this to prevent broadcasts from background services from inadvertently or unnecessarily launching components of stoppped applications. A background service or application can override this behavior by adding the FLAG_INCLUDE_STOPPED_PACKAGES flag to broadcast intents that should be allowed to activate stopped applications.

As the above references point out it will prevent broadcast intents delivering to stopped packages. Actually this control mechanism will ensure safety and save energy.

Android 3.1 APIs

翻译:

在 系统设置 - 应用管理 中的“强制停止” 作用是让app处于(stopped)停止状态。

下面是google的官方描述:

什么是停止状态?

从Andriod3.1开始,系统包管理服务会一直追踪处于停滞状态的app,并提供了控制它们从后台进程或其他应用程序启动的方法。

注意:应用程序的停止状态不同于activity(活动)的停止状态。系统是分开来处理这两类停止状态的。

为什么Android要添加这个功能?

注意:系统为所有用于发送广播的Intent默认添加了FLAG_EXCLUDE_STOPPED标志。这样做是为了阻止发送自后台service的广播不小心启动某个已停止应用的组件。一个后台service服务或app应用程序可以

通过向广播的Intent对象添加FLAG_INCLUDE_STOPPED_PACKAGES标志,覆盖重写这个行为,使得该广播可以激活处于停止状态的应用程序。

上述描述指出:系统默认会阻止停止状态的app接收广播。这个控制机制的目的是保证安全、节约电量。

所以,要实现安装apk后自启动,前提是

1、触发ACTION_PACKAGE_REPLACED 广播(也就是apk覆盖替换安装才接收的到,初次安装的广播ACTION_PACKAGE_ADDED 不会被当前安装包触发,因为该app未运行过)

2、在app项目中使用静态注册广播(因为动态广播是app运行后才可以接受到)

3、app曾经运行过(即不处于stopped状态)

在Android5.1真机上测试:

初次安装的app不会触发广播。

覆盖安装未运行过的app,不会触发广播

安装完运行app后,退出App(点击返回键、并从recent任务中移除,此时在设置-应用中查看,app仍未处于stop状态)。覆盖安装后,app成功自动运行。(可看做实现安装后自启动)

此时退出App,并在设置-应用中把app进行【强制停止】。覆盖安装后,app没有自动运行。(此时在设置-应用中查看,app处于stop状态)

所以,只要在App运行时,直接覆盖安装apk,是可以用广播接收器实现安装完后自启动的。 (至少在android 5.1上 ^,^)

下面简单介绍下代码:

(1)自定义广播接收器:

public class MyReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		String action = intent.getAction();
		String localPkgName = context.getPackageName();//取得MyReceiver所在的App的包名
		Uri data = intent.getData();
		String installedPkgName = data.getSchemeSpecificPart();//取得安装的Apk的包名,只在该app覆盖安装后自启动
		if((action.equals(Intent.ACTION_PACKAGE_ADDED)
				|| action.equals(Intent.ACTION_PACKAGE_REPLACED)) && installedPkgName.equals(localPkgName)){
			Intent launchIntent = new Intent(context,MainActivity.class);
			launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
			context.startActivity(launchIntent);
		}
	}
}

(2)AndroidManifest.xml中静态注册广播接收器

<application
  android:allowBackup="true"
  android:icon="@drawable/ic_launcher"
  android:label="@string/app_name"
  android:theme="@style/AppTheme" >
  <activity
   android:name="com.example.mydemo.MainActivity"
  	android:configChanges="orientation|keyboard"
   android:label="@string/app_name">
   <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>
  </activity>
  <receiver android:name="com.example.mydemo.MyReceiver">
   <intent-filter>
    <action android:name="android.intent.action.PACKAGE_ADDED" />
    <action android:name="android.intent.action.PACKAGE_REPLACED" />
    <action android:name="android.intent.action.PACKAGE_REMOVED" />
    <data android:scheme="package"/>
   </intent-filter>
  </receiver>
 </application>

以上这篇Android应用实现安装后自启动的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Android中实现开机自动启动服务(service)实例

    最近在将 HevSocks5Client 移植到 Android 上了,在经过增加 signalfd 和 timerfd 相关的系统调用支持后,就可以直接使用 NDK 编译出 executable 了.直接的 native exectuable 在 Android 系统总还是不太方便用哦.还是做成一个 apk 吧,暂定只写一个 service 并开机自动启用,无 activity 的. Java 中调用 native 程序我选择使用 JNI 方式,直接在 JNI_OnLoad 方法中调用 pth

  • android引导用户开启自启动权限的方法

    前言: 最近在做项目的过程中遇到了以下一个需求,虽然看起来不难实现,但是在实现的过程中遇到了各种坑,记录一下,今后方便查看!!! 需求: 用户第一次安装APP,点击授权按钮,跳转至授权的页面(不同手机跳转到不同的授权页面),用户授权成功之后,点击返回按钮,直接进入主页面 问题: 1.如何适配不同机型 2.不同机型的授权页面显示不同弹窗(比如三星显示悬浮窗,小米显示弹窗) 3.小米弹窗始终无法显示 4.在授权页面点击返回按钮,怎么直接跳转到主页面 问题1:适配不同机型 这个是借鉴的一篇博文(忘记地

  • android应用实现开机自动启动方法

    原理:Android系统在开机的时候会发出一个广播.这样我们就可以接收这个广播,然后启动我们的应用.广播接收器必须在xml里面配置,因为xml里面配置的广播接收器  是不随着应用的退出而退出的. 广播接收器: package com.yangshidesign.boot; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public c

  • Android程序静默安装安装后重新启动APP的方法

     一:需求简介 之前boss提出一个需求,运行在广告机上的app,需要完成自动升级的功能,广告机是非触摸屏的,不能通过手动点击,所以app必须做到自动下载,自动安装升级,并且安装完成后,app还要继续运行,最好不借助其它app来实现以上功能.  二:实现思路 实现这个功能第一个想到的方法就是静默安装,由于广告机已经root,静默安装比较顺利,安装app的主要代码如下: /* @pararm apkPath 等待安装的app全路径,如:/sdcard/app/app.apk **/ private

  • Android编程实现开机自动运行的方法

    本文实例讲述了Android编程实现开机自动运行的方法.分享给大家供大家参考,具体如下: 有些时候,应用需要在时就运行,例如某个自动从网上更新内容的后台service.怎样实现开机自动运行的应用?在撰写本文时,联想到高焕堂先生以"Don''t call me, I''ll call you back!"总结框架,真是说到点子上了.理解这句话的含义,许多有关Android平台上实现某种的问题,都能迎刃而解. 使用场景:开机后,自动运行,在上显示"Hello. I started

  • Android开机自启动程序详解

    背景知识:当Android启动时,会发出一个系统广播,内容为ACTION_BOOT_COMPLETED,它的字符串常量表示为 android.intent.action.BOOT_COMPLETED.只要在程序中"捕捉"到这个消息,再启动之即可.记住,Android框架说:Don''t call me, I''ll call you back.我们要做的是做好接收这个消息的准备,而实现的手段就是实现一个BroadcastReceiver.1.界面Activity,BootStartDe

  • Android应用实现安装后自启动的方法

    和网上大多数方法一样,使用广播手段: ACTION_PACKAGE_ADDED 一个新应用包已经安装在设备上,数据包括包名(最新安装的包程序不能接收到这个广播) ACTION_PACKAGE_REPLACED 一个新版本的应用安装到设备,替换之前已经存在的版本 ACTION_PACKAGE_CHANGED 一个已存在的应用程序包已经改变,包括包名 ACTION_PACKAGE_REMOVED 一个已存在的应用程序包已经从设备上移除,包括包名(正在被安装的包程序不能接收到这个广播) ACTION_

  • Android的权限设置及自启动设置方法

    在开发项目中,遇到了两大麻烦: 1.涉及到的系统的权限较多(拍照.录音.定位.拨号等). 对于这点,有很多人会拒绝这些权限,那就尴尬了,他们又不懂只会跟我们反应这什么破app,这个不好用,那个不好使,更可恶的是不同手机的系统设置都长不一样,根本就不好跟他们讲在那里进行设置.于是想到解决的办法就是:在app中添加一个设置权限按钮让app直接跳到它的权限设置界面,这就方便多了.代码段如下: /** * 跳转到权限设置界面 */ private void getAppDetailSettingInte

  • android实现静默安装与卸载的方法

    本文实例讲述了android实现静默安装与卸载的方法.分享给大家供大家参考.具体如下: 方法1:[使用调用接口方法,由于安装卸载应用程序的部分API是隐藏的,所以必须下载Android系统源码,在源码下开发并编译之后使用MM命令编译生成APK文件] import java.io.File; import android.app.Activity; import android.os.Bundle; import android.content.Intent; import android.con

  • 解决Android studio3.6安装后gradle Download失败(构建不成功)

    因为课程需要,昨天好多同学在安装Android studio3.6.1后,无法构建,不知道什么原因,我的电脑上使用的是之前3.4版本的,可以正常使用,所以没太关心.但晚上我想到3.6版本应该有一些新功能,所以我就想升级一下,升级完之后,发现之内的设计视图是不显示的,需要该工程成功构建之后才能正常使用,于是我就build一下,结果就凉凉了 gradle Download十几分钟,然后失败 两次之后我想到可能是因为跨版本更新可能导致很多东西报错.于是卸载重新安装新版本的,之后构建情况一模一样, gr

  • Android实现静默安装的两种方法

    前言 一般情况下,Android系统安装apk会出现一个安装界面,用户可以点击确定或者取消来进行apk的安装. 但在实际的项目需求中,有一种需求,就是希望apk在后台安装(不出现安装界面的提示),这种安装方式称为静默安装.下面这篇文章就给大家介绍了两种方法来实现,下面来一起看看吧. 1.root权限静默安装实现 实现实际使用的是su pm install -r filePath命令. 核心代码如下: protected static void excuteSuCMD() { Process pr

  • Android开发之APP安装后在桌面上不显示应用图标的解决方法

    本文实例讲述了Android开发之APP安装后在桌面上不显示应用图标的解决方法.分享给大家供大家参考,具体如下: 一.问题: 前几天在写项目的时候运行的时候突然Android桌面上没有了应用图标,但是应用里面下载的应用有.调试版本和发布正式的版本都没有,之前以为是因为用了不同的keystore发布了两个不同的正式版本造成的问题.后来在看别人的文章才知道是什么问题. 二.分析: 原因就是activity中的intent-filter用了不同的data和action属性.intent-filter必

  • Android应用第一次安装成功点击“打开”后Home键切出应用后再点击桌面图标返回导致应用重启问题的解决方法

    if((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0){ finish(); return; } 应用程序入口Activity的onCreate方法中加入上面的判断,完美解决应用程序多次重启问题. 应用程序入口Activity的onCreate方法中加入上面的判断,在setcontentview方法之前调用. 以上所述是小编给大家介绍的 Android应用第一次安装成功点击"打开"后Ho

  • Android 静默安装和卸载的方法

    本文介绍了Android 静默安装和卸载的方法,分享给大家,具体如下: 一. 条件 系统签名 需要放到 /system/app里作为系统app 二. 适用环境 机顶盒开发,系统开发,车机开发,智能设备开发. 三. 步骤 1. 在 AndroidManifest.xml 中 1.1. 在清单文件 AndroidManifest.xml 添加 android.uid.system 声明为系统应用. 1.2. 权限 <uses-permission android:name="android.p

  • Android检查手机有没有安装某应用的方法

    本文实例讲述了Android检查手机有没有安装某应用的方法.分享给大家供大家参考,具体如下: 手机用户尤其厌烦手动输入大量信息,在一个程序中可以调用其他程序或功能往往可以给用户更好的用户体验,让用户倍感亲切,所以程序间这样的整合可以 促成多方软件协同工作的"共赢"局面. 那我们在我们自己的程序中调用其他程序时往往要检查手机有没有安装该软件后再做相应操作,如没有安装,用intent将用户引导至android market去下载该程序,如已安装则打开该程序,并传入参数和调用其功能. 下面介

随机推荐