`

Android Service被关闭后自动重启,解决被异常kill 服务

 
阅读更多
每次调用startService(Intent)的时候,都会调用该Service对象的onStartCommand(Intent,int,int)方法,这个方法return 一个int值,return 的值有四种:
 
START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
 
START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。
 
START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
 
 
START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。

 

1.在service中重写下面的方法,这个方法有三个返回值, START_STICKY是service被kill掉后自动重写创建
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}----------------
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
Log.v("TrafficService","startCommand");

flags = START_STICKY;
return super.onStartCommand(intent, flags, startId);
// return START_REDELIVER_INTENT;
}
2.在Service的onDestroy()中重启Service.
public void onDestroy() { 
Intent localIntent = new Intent();
localIntent.setClass(this, MyService.class); //销毁时重新启动Service
this.startService(localIntent);
}---------------------------------------------
用qq管家杀掉进程的时候,调用的是系统自带的强制kill功能(即settings里的),在kill时,会将应用的整个进程停掉,当然包括service在内,如果在running里将service强制kill掉,显示进程还在。不管是kill整个进程还是只kill掉进应用的 service,都不会重新启动service。不知道你是怎么怎么实现重启的,实在是不解。。。
ps:在eclipse中,用stop按钮kill掉进程的时候,倒是会重启service
KILL问题:
1. settings 中stop service
onDestroy方法中,调用startService进行Service的重启。
2.settings中force stop 应用
捕捉系统进行广播(action为android.intent.action.PACKAGE_RESTARTED)
3. 借助第三方应用kill掉running task
提升service的优先级
--------------------------------------------
service开机启动

http://blog.csdn.net/flying_vip_521/article/details/7053355

  • 今天我们主要来探讨android怎么让一个service开机自动启动功能的实现。Android手机在启动的过程中会触发一个Standard Broadcast Action,名字叫android.intent.action.BOOT_COMPLETED(记得只会触发一次呀),在这里我们可以通过构建一个广播接收者来接收这个这个action.下面我就来简单写以下实现的步骤:
  • 第一步:首先创建一个广播接收者,重构其抽象方法 onReceive(Context context, Intent intent),在其中启动你想要启动的Service或app。

    • import android.content.BroadcastReceiver;
    • import android.content.Context;
    • import android.content.Intent;
    • import android.util.Log;
    • public class BootBroadcastReceiver extends BroadcastReceiver {
    • //重写onReceive方法
    • @Override
    • public void onReceive(Context context, Intent intent) {
    • //后边的XXX.class就是要启动的服务
    • Intent service = new Intent(context,XXXclass);
    • context.startService(service);
    • Log.v("TAG", "开机自动服务自动启动.....");
    • //启动应用,参数为需要自动启动的应用的包名
    • Intent intent = getPackageManager().getLaunchIntentForPackage(packageName);
    • context.startActivity(intent );
    • }
    • }
  • 第二步:配置xml文件,在receiver接收这种添加intent-filter配置
  • <receiver android:name="BootBroadcastReceiver">
  • <intent-filter>
  • <action android:name="android.intent.action.BOOT_COMPLETED"></action>
  • <category android:name="android.intent.category.LAUNCHER" />
  • </intent-filter>
  • </receiver>
  • 第三步:添加权限 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />




---------------------------------------------------
如何实现一个不会被杀死的进程
看Android的文档知道,当进程长期不活动,或系统需要资源时,会自动清理门户,杀死一些Service,和不可见的Activity等所在的进程。
但是如果某个进程不想被杀死(如数据缓存进程,或状态监控进程,或远程服务进程),应该怎么做,才能使进程不被杀死。

add android:persistent="true" into the <application> section in your AndroidManifest.xml

切记,这个不可滥用,系统中用这个的service,app一多,整个系统就完蛋了。
目前系统中有phone等非常有限的,必须一直活着的应用在试用。

------------------------------------------------
提升service优先级的方法

Android 系统对于内存管理有自己的一套方法,为了保障系统有序稳定的运信,系统内部会自动分配,控制程序的内存使用。当系统觉得当前的资源非常有限的时候,为了保 证一些优先级高的程序能运行,就会杀掉一些他认为不重要的程序或者服务来释放内存。这样就能保证真正对用户有用的程序仍然再运行。如果你的 Service 碰上了这种情况,多半会先被杀掉。但如果你增加 Service 的优先级就能让他多留一会,我们可以用 setForeground(true) 来设置 Service 的优先级。 

  为什么是 foreground ? 默认启动的 Service 是被标记为 background,当前运行的 Activity 一般被标记为 foreground,也就是说你给 Service 设置了 foreground 那么他就和正在运行的 Activity 类似优先级得到了一定的提高。当让这并不能保证你得 Service 永远不被杀掉,只是提高了他的优先级。 
  从Android 1.5开始,一个已启动的service可以调用startForeground(int, Notification)将service置为foreground状态,调用stopForeground(boolean)将service置为 background状态。 
  我们会在调用startForeground(int, Notification)传入参数notification,它会在状态栏里显示正在进行的foreground service。background service不会在状态栏里显示。 
  在Android 1.0中,将一个service置为foreground状态: 
  setForeground(true); 
  mNM.notify(id, notification); 
  将一个service置为background状态: 
  mNM.cancel(id); 
  setForeground(false); 
  对比看出,在1.0 API中调用setForeground(boolean)只是简单的改变service的状态,用户不会有任何觉察。新API中强制将 notification和改变service状态的动作绑定起来,foreground service会在状态栏显示,而background service不会。 
  Remote service controller & binding 
  跨进程调用Service。暂时不研究。 
-------------------------------------------------------
如何防止Android应用中的Service被系统回收? 很多朋友都在问,如何防止Android应用中的Service被系统回收?下面简单解答一下。

对于Service被系统回收,一般做法是通过提高优先级可以解决,在AndroidManifest.xml文件中对于intent-filter可以通过android:priority = "1000"这个属性设置最高优先级,1000是最高值,如果数字越小则优先级越低,同时实用于广播,推荐大家如果你的应用很重要,可以考虑通过系统常用intent action来触发。

分享到:
评论

相关推荐

    Android如何保证自己的服务被系统kill后又被系统重启?

    要确保服务在被系统kill后能够自动重启,开发者需要采取一些策略。以下是一些关键知识点: 1. **START_STICKY**: 当服务被标记为`START_STICKY`时,如果系统因资源限制而停止服务,Android系统会在内存条件允许时...

    安卓后台服务相关-Service意外被kill利用监听来重新启动.rar

    本资料包"安卓后台服务相关-Service意外被kill利用监听来重新启动.rar"探讨了如何在Service被kill后利用监听机制来实现服务的自动重启,以确保服务的持续运行。 一、Service的基本概念 1. Service是Android四大组件...

    如何使Android app不被kill.docx

    - **自动重启Service**:如果Service被系统清理,可以通过监听特定广播事件(如屏幕解锁)自动重启Service。这种方式需要在Service的`onStartCommand()`方法中返回`START_STICKY`,表示即使Service被销毁也会尝试...

    Android 如何保证service在后台不被kill

    - `START_NOT_STICKY`:Service被kill后不会自动重启,除非有新的Intent触发startService。 - `START_REDELIVER_INTENT`:Service被kill后,系统会重新启动Service并传回最后一个Intent,确保未完成的任务得以继续...

    android关闭应用程序

    总之,在Android开发中,关闭应用程序或管理进程并非简单的一行代码所能解决的问题,它涉及到权限管理、资源释放、异常处理等多个方面。开发者应根据具体场景选择最合适的方法,并遵循最佳实践,以确保应用的稳定性...

    Android全局捕获崩溃异常记录日志保存至本地并定时删除

    为了解决这个问题,开发者通常会实现全局异常捕获机制,以便在程序崩溃时记录异常信息,并将这些日志保存到本地。此外,为了维护存储空间的有效利用,日志还需要定时清理。本文将详细介绍如何在Android中实现这一...

    Android双进程守护

    5. 权限管理:由于涉及系统级别的操作,可能需要请求一些特殊的权限,例如`android.permission.KILL_BACKGROUND_PROCESSES`,以允许你的服务终止其他进程。 6. 错误处理和调试:为了保证服务的稳定性和可靠性,务必...

    Android 实现彻底退出自己APP 并杀掉所有相关的进程

    这将杀死当前应用的进程,但是需要注意的是,ActivityManager 会监听进程的状态,一旦发现进程被非正常 Kill,它将会试图去重启这个进程。这就是为什么,有时候当我们试图这样去结束掉应用时,发现 app 会自动重新...

    android开发timeout出错的详解

    如果有设备列出,但安装仍失败,尝试用`adb kill-server`和`adb start-server`命令重启adb服务。 10. **使用冷启动模拟器**: 避免热启动模拟器,即直接从上次关闭的状态恢复,而是选择“冷启动”,这样可以避免...

    Android應用開發環境

    如果遇到adb服务问题,如“daemon not running”错误,可以使用`adb kill-server`关闭服务,然后再重启。 DDMS,即Dalvik Debug Monitor Service,是Android开发环境中的另一个关键工具,它提供了丰富的调试功能。...

    Android计时器例子

    4. 在`onStartCommand`方法中返回适当的启动命令,这将决定服务在被杀死后如何重启。 接下来,我们讨论`广播接收器`(BroadcastReceiver)。广播接收器是一种可以监听系统或应用发出广播的组件。在这个计时器例子中...

    用ADB命令解决手机替换系统文件导致死机或无限重启.pdf

    在Android开发和调试过程中,经常遇到手机系统文件被替换后导致的设备死机或无限重启的问题。本文将详细介绍如何利用ADB(Android Debug Bridge)工具来解决这些问题,同时普及ADB的基础知识及其常用命令。 ADB是...

    Android程序完全退出的方法

    这种方法的优点在于它可以确保应用程序被干净地重启,但是缺点是需要用户的权限授予,可能会引起用户的注意。 #### 四、利用Activity生命周期:`Intent.FLAG_ACTIVITY_CLEAR_TOP` **方法概述:** 通过设置 `...

    android shell命令客户端-超级终端

    3. **执行操作**:运行如`ls -l`查看目录内容,`reboot`重启设备,或`stop service_name`停止指定服务等。 4. **获取root权限**:输入`su`,如果设备已root,将会切换到root用户,赋予所有权限。 **常用的Android ...

    Android在TQ2440开发板上的移植[归纳].pdf

    Android操作系统被广泛应用于各种设备,包括智能手机、平板电脑以及各种嵌入式系统。TQ2440开发板是一款基于Samsung S3C2440处理器的嵌入式开发平台,具有较高的性能和灵活性,适合进行Android系统的移植和应用开发...

    Android应用源码之强行结束APP进程的方法.zip

    在Android系统中,应用程序的生命周期是由操作系统管理的,但有时候开发者可能需要在特定情况下手动结束APP的进程。本文将深入探讨如何在Android应用源码中实现这一功能,以"强行结束APP进程的方法"为主题,我们将从...

    android 强行结束APP进程的方法.zip

    Android提供了`ActivityManager`类,它是用来管理Android系统的活动(Activity)和服务(Service)的。我们可以通过它的`killBackgroundProcesses()`方法来结束一个应用的后台进程。此方法需要`KILL_BACKGROUND_...

    [计算机软件及应用]Android开发者指南.doc

    - `adb emu kill`:关闭模拟器。 - `adb emu start`:启动模拟器。 - `adb shell`:进入设备的shell环境,可以执行各种Linux命令。 四、调试与性能分析: - `adb jdwp`:列出所有正在运行的Java调试协议(JDWP...

Global site tag (gtag.js) - Google Analytics