在xml中注册

 <!-- 开机广播 -->
<receiver android:name=".receiver.BootBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</receiver>

启动 app核心服务

package com.boai.base.receiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent; import com.boai.base.service.CoreService; public class BootBroadcastReceiver extends BroadcastReceiver { @Override
public void onReceive(Context context, Intent intent) { // 启动App核心Service
Intent startCoreServiceIntent = new Intent(context, CoreService.class);
context.startService(startCoreServiceIntent);
} }

  服务类

public class CoreService extends Service

  在服务类中 注册广播

   @Override
public void onCreate() {
super.onCreate(); // 注册广播
regBroadcastReceiver();
}

  生成需要的广播

private void regBroadcastReceiver() {
IntentFilter mPushMsgBrFileter = new IntentFilter();
mPushMsgBrFileter.addAction(Constants.BR_ACTION_UMENG_PUSH_MSG);
mPushMsgBrFileter.addAction(Constants.BR_ACTION_USER_LOGIN);
mPushMsgBrFileter.addAction(Constants.BR_ACTION_USER_LOGOUT);
registerReceiver(mBroadcastReceiver, mPushMsgBrFileter);
}

  广播接收处理

//创建一个可根据需要创建新线程的线程池

mThreadPool = Executors.newCachedThreadPool();
    // 广播接收
private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (Constants.BR_ACTION_UMENG_PUSH_MSG.equals(action)) {
// 推送消息
if (AppCookie.getUserId() == -1) {
return ;
} final Serializable tempObj = intent.getSerializableExtra(Constants.OBJECT);
if (null == tempObj) {
return ;
} mThreadPool.submit(new Runnable() {
@Override
public void run() {
handlerPushMsg((PushMsgBean)tempObj);
}
});
} else if (Constants.BR_ACTION_USER_LOGIN.equals(action)) {
// 登录
// 更新用户位置
mHandler.removeMessages(HANDLER_WHAT_UPDATE_USER_LOCALTION);
mHandler.sendEmptyMessage(HANDLER_WHAT_UPDATE_USER_LOCALTION);
} else if (Constants.BR_ACTION_USER_LOGOUT.equals(action)) {
// 登出,移除相应广播
mHandler.removeMessages(HANDLER_WHAT_UPDATE_USER_LOCALTION);
}
}
};

  

/**
* 处理推送消息
* @param retPushMsg 推送消息对象
*/
private void handlerPushMsg(PushMsgBean retPushMsg) {
//... // 广播给需要通知刷新的界面
msg.setReadStatus(0); Intent intent = new Intent(Constants.BR_ACTION_NEW_MSG);
intent.putExtra(Constants.OBJECT, msg);
sendBroadcast(intent); // 是否免打扰
boolean isNofityNoDisturb = AppCookie.getBoolean(Constants.STATUS_BUSINESS_PUSH, false);
if (!isNofityNoDisturb) {
// 发送显示通知栏
mHandler.obtainMessage(HANDLER_WHAT_NEW_MSG_PUSH, msgDbID, 0, retPushMsg).sendToTarget();
}
}

  //handler

 // Handler处理
private static class MyHandler extends Handler {
private WeakReference<CoreService> wrf; public MyHandler(CoreService coreService) {
wrf = new WeakReference<>(coreService);
} @Override
public void handleMessage(Message msg) {
super.handleMessage(msg); final CoreService curCoreService = wrf.get(); if (null == curCoreService) {
return ;
} switch (msg.what) {
case HANDLER_WHAT_NEW_MSG_PUSH: {
final PushMsgBean curPushMsg = (PushMsgBean)msg.obj;
final int msgDbId = msg.arg1; int msgType = curPushMsg.getMsgtype();
if (msgType == MsgTypeEnum.FOLLOW.getTypeValue()) {
try {
String url = AppUtil.getUnifyImageUrl(ImageType.USER_ICON, Long.parseLong(curPushMsg.getSid()));
ImageLoader.getInstance().loadImage(url, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String s, View view) {
} @Override
public void onLoadingFailed(String s, View view, FailReason failReason) {
curCoreService.mNotificationUtil.showPushMsgNotify(curPushMsg, msgDbId, null);
} @Override
public void onLoadingComplete(String s, View view, Bitmap bitmap) {
curCoreService.mNotificationUtil.showPushMsgNotify(curPushMsg, msgDbId, bitmap);
} @Override
public void onLoadingCancelled(String s, View view) {
curCoreService.mNotificationUtil.showPushMsgNotify(curPushMsg, msgDbId, null);
}
});
} catch (Exception e) {
e.printStackTrace();
curCoreService.mNotificationUtil.showPushMsgNotify(curPushMsg, msgDbId, null);
}
} else {
curCoreService.mNotificationUtil.showPushMsgNotify(curPushMsg, msgDbId, null);
}
break;
}
}
}
}

  服务关闭

    @Override
public void onDestroy() {
super.onDestroy(); unregisterReceiver(mBroadcastReceiver);
}

  


Android 开机启动服务的更多相关文章

  1. android开机启动应用和服务

    注冊广播监听开机状态.启动应用和服务等: 监听开机的广播接收器: public class BootCompletedReceiver extends BroadcastReceiver{ @Over ...

  2. android开机启动流程说明

    android开机启动流程说明 第一步:启动linux 1.Bootloader 2.Kernel 第二步android系统启动:入口为init.rc(system\core\rootdir) 1./ ...

  3. Android开机启动Activity或者Service方法

    本文出自 “Bill_Hoo专栏” 博客,请务必保留此出处http://billhoo.blog.51cto.com/2337751/761230 这段时间在做Android的基础开发,现在有一需求是 ...

  4. ANDROID 开机启动VNC SERVER

    ANDROID 开机启动VNC SERVER 背景信息: 最近在做一个项目,在项目需求中有这么一项“要把VNC SERVER 添加到android里并让其开机自启动”.其实做这个项目也挺缚手缚脚的,因 ...

  5. Hortonworks HDP Sandbox定制(配置)开机启动服务(组件)

    定制Hortonworks HDP开机启动服务能够这样做:本文原文出处: http://blog.csdn.net/bluishglc/article/details/42109253 严禁不论什么形 ...

  6. Android开机启动Activity或者Service方法(转载)

    这段时间在做Android的基础开发,现在有一需求是开机启动,按照网上某些博文教程做了下,始终不成功,一开机总是提示所启动的应用程序意外终止,于是参考了Android SDK doc,终于解决问题,下 ...

  7. Centos7.x:开机启动服务的配置和管理

    一.开机启动服务的配置 1.创建服务配置(权限754) vim /usr/lib/systemd/system/nginx.service 文件内容解释 [Unit]:服务的说明Description ...

  8. linux chkconfig添加开机启动服务

    --add:增加所指定的系统服务,让chkconfig指令得以管理它,并同时在系统启动的叙述文件内增加相关数据: --del:删除所指定的系统服务,不再由chkconfig指令管理,并同时在系统启动的 ...

  9. linux自定义开机启动服务和chkconfig使用方法

    linux自定义开机启动服务和chkconfig使用方法 1. 服务概述在linux操作系统下,经常需要创建一些服务,这些服务被做成shell脚本,这些服务需要在系统启动的时候自动启动,关闭的时候自动 ...

随机推荐

  1. Windows Vista for Developers——第四部分:用户帐号控制(User Account Control,UAC)

    作者:Kenny Kerr 翻译:Dflying Chen 原文:http://weblogs.asp.net/kennykerr/archive/2006/09/29/Windows-Vista-f ...

  2. 5.js屏蔽方向键,兼容IE和firefox

    document.onkeydown=function(e){ e=e||event; //屏蔽向左的方向键 if(e.keyCode==37){ alert('禁止向左的方向键!'); return ...

  3. MFC绘制直角坐标系

    void CMyPicoTestDlg::DrawWave(CDC *pDC,CRect &rectPicture) { CPen newPen; //用于创建新画笔 CPen *pOldPe ...

  4. Eigen中的noalias(): 解决矩阵运算的混淆问题

    作者:@houkai本文为作者原创,转载请注明出处:http://www.cnblogs.com/houkai/p/6349990.html 目录 混淆例子解决混淆问题混淆和component级的操作 ...

  5. SmartSql使用教程(3)——SmartSql中的事务,及AOP的使用

    一.引言 经过两章的铺垫,我们现在对SmartSql已经有了一定的了解,那么今天我们的主题是事务处理.事务处理是常用的一种特性,而SmartSql至少提供了两种使用事务的方法.一种是通过Reposit ...

  6. Android开发实践:掌握Camera的预览方向和拍照方向

    http://ticktick.blog.51cto.com/823160/1592267?utm_source=tuicool&utm_medium=referral Android的Cam ...

  7. unity关于StartCoroutine的简单线程使用

    StartCoroutine在unity3d的帮助中叫做协程,意思就是启动一个辅助的线程. 在C#中直接有Thread这个线程,但是在unity中有些元素是不能操作的.这个时候可以使用协程来完成. 使 ...

  8. hdu1536(sg函数)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1536 题意:首先输入K 表示一个集合的大小  之后输入集合 表示对于这对石子只能去这个集合中的元素的个 ...

  9. [Xcode 实际操作]九、实用进阶-(17)使用CGBlendMode改变UIImage颜色,实现对图片进行混合着色

    目录:[Swift]Xcode实际操作 本文将演示如何使用CGBlendMode改变UIImage颜色,实现对图片进行混合着色. 在项目文件夹[DemoApp]上点击鼠标右键 ->[New Fi ...

  10. lombok常用注解

    简介: Lombok能以简单的注解形式来简化java代码,提高开发人员的开发效率.例如开发中经常需要写的javabean,都需要花时间去添加相应的getter/setter,也许还要去写构造器.equ ...