美文网首页Android 知识Android知识android
Android应用在未启动的情况下接受指定广播

Android应用在未启动的情况下接受指定广播

作者: itbird01 | 来源:发表于2018-05-07 15:06 被阅读303次

最近项目中遇到一个这样的需求,如何使App在接收到指定广播的时候,做特定的事情(启动APP或者做某些数据收集操作)
思考:如果APP已经启动,只需注册相应的广播就可以实现这个需求,但是如果APP从未启动过呢?

问题原因

Android在3.1以后将新安装的应用置为“STOPPED”状态,只有当应用启动过一次之后这个状态才会改变,同时,从Android 3.1开始,系统的包管理器保持跟踪处于停止状态(stopped state)的应用程序,提供了一种控制其从后台进程和其它应用程序启动的方式。这种停止状态的应用程序指那些安装了但从未启动过的apk,或被用户在程序管理中force stop的apk。Android系统为防止广播无意或不必要开启停止状态的组件,它给所有广播intent添加了FL​​AG_EXCLUDE_STOPPED_PACKAGES标志(不设置和同FLAG_INCLUDE_STOPPED_PACKAGES一起设置结果都是此标志)

简言之就是:从Android 3.1开始,系统给intent定义了两个新的Flag,分别为FLAG_INCLUDE_STOPPED_PACKAGES(表示包含未启动的App)和FLAG_EXCLUDE_STOPPED_PACKAGES(表示不包含未启动的App),用来控制Intent是否要对处于停止状态的App起作用,而默认所有广播intent flag都是FLAG_EXCLUDE_STOPPED_PACKAGES。

解决方案

在发送intent的地方加上FLAG_INCLUDE_STOPPED_PACKAGES

Intent intent = new Intent();
intent.setAction("ITBIRD.TEST.ACTION");
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
sendBroadcast(intent);

在您的App中注册广播并创建广播器接收指定广播即可。
注册指定广播

 <receiver android:name=".MyReceiver">
            <intent-filter>
                <action android:name="ITBIRD.TEST.ACTION"/>
            </intent-filter>
</receiver>

自定义广播接收器

package itbird.com.myapplication33;

import android.app.ActivityManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import java.util.List;

/**
 * 自定义广播接收器
 * Created by xfkang on 2018/5/7.
 */

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent == null) {
            return;
        }

        Log.d("MyReceiver", intent.getAction());
        if (!isRun(context, "itbird.com.myapplication33")) {
            intent.setClass(context, MainActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent);
        }
    }

    /**
     * 判断应用是否在运行
     *
     * @param context
     * @return
     */
    public boolean isRun(Context context, String packagename) {
        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningTaskInfo> list = am.getRunningTasks(100);
        boolean isAppRunning = false;
        //100表示取的最大的任务数,info.topActivity表示当前正在运行的Activity,info.baseActivity表系统后台有此进程在运行
        for (ActivityManager.RunningTaskInfo info : list) {
            if (info.topActivity.getPackageName().equals(packagename) || info.baseActivity.getPackageName().equals(packagename)) {
                isAppRunning = true;
                Log.d("ActivityService isRun()", info.topActivity.getPackageName() + " info.baseActivity.getPackageName()=" + info.baseActivity.getPackageName());
                break;
            }
        }
        Log.d("ActivityService isRun()", "com.ad 程序  ...isAppRunning......" + isAppRunning);
        return isAppRunning;
    }
}

相关文章

  • Android应用在未启动的情况下接受指定广播

    最近项目中遇到一个这样的需求,如何使App在接收到指定广播的时候,做特定的事情(启动APP或者做某些数据收集操作)...

  • Android应用在未启动的情况下无法收到指定广播的问题总结

     最近在做一个需求:程序没有桌面图标,安装后能够自动将其插件添加到Launcher上,也就是程序在未启动的情况下,...

  • Android Intent笔记

    Intent作用 启动Activity 启动Service 发送广播 类型 显示Intent:按照类名指定要启动的...

  • 打造启动页面

    启动页面 目前,很多 Android 应用都有一个启动界面 (Launch/Splash Screen),即应用在...

  • Broadcast广播的基本使用

    全局广播:在整个Android系统中应用不但可以接受自己的广播,也可以接受别的应用的广播,或则系统的广播(开机广播...

  • BroadcastReceiver

    Android 8.0 之后静态注册广播接收不到自定义广播:解决方法:指定Component.

  • Android--广播

    1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,Broadca...

  • iOS 友盟推送(二)远程推送处理

    1.程序未启动处理通知 2.程序已启动-应用在前台处理通知 3.程序已启动-应用在后台处理通知 **仅支持iOS1...

  • Android 开机自启动 App

    Android 设备开机自启动的可以用广播实现,因为 Android 设备开机时会发送一条开机广播 "androi...

  • Android App 开机自启动

    Android 设备开机自启动的可以用广播实现,因为 Android 设备开机时会发送一条开机广播 "androi...

网友评论

  • 0f5d12814370:安装的应用都没有打开,还能发送特定广播?
    itbird01:@惜nat忆 亲,你理解错了,不是我的APP发送,文章的意思是,想要让我的APP在未启用的情况下,去接收某个广播,启动并做某些事情。这个广播发送者必须添加FLAG_INCLUDE_STOPPED_PACKAGES,我的应用才可以收到。:sweat: :cold_sweat: :scream:
    0f5d12814370:@itbird01 知道呢, 你说解决方案
    在发送intent的地方加上FLAG_INCLUDE_STOPPED_PACKAGES
    既然 App没打开,怎么发送这个特定广播呢
    itbird01:不是发送广播。。。是接收广播,我的文章标题是《Android应用在未启动的情况下接受指定广播》,亲,好好看哦:smile: :smile: :smile:
  • 0a3e7783cf45:不错,写的很好。
  • 容华谢后:学习了,以后可能用得着
  • bingin:mark

本文标题:Android应用在未启动的情况下接受指定广播

本文链接:https://www.haomeiwen.com/subject/hudmrftx.html