解决Android后台清理APP后,程序自动重启的问题

  最近解决了一个Android APP的bug,发现APP在被后台清理后,会自动重启。现象很奇怪,有的手机(HTC)后台清理后,程序必crash,而有的手机(小米)程序不会crash。查找问题时,发现HTC手机执行后台清理后,程序会自动重启,而小米手机则没有。猜想可能是小米手机内部做了处理,当执行后台清理后,对应的APP不会再重启了。不过问题在于,HTC手机后台清理,为什么会导致程序crash。

  Debug后发现,APP内部有一个Service,在Service的onStartCommand函数中,返回值是一个int。主要的两个值是START_STICKY和START_NOT_STICKY。START_STICKY的含义是如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。而START_NOT_STICKY是“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。

  我们的程序设置的是START_STICKY,程序择机重启时,一些变量没有初始化,导致crash。改为START_NOT_STICKY后,问题解决了。但是还剩下一个问题,老大发现微信的APP不管在HTC还是小米的机器上,执行后台清理后,其Service都还在,这就很奇怪了,同事猜,可能是手机ROM中对特定的程序设置了白名单。个人觉得不大可能,但问题在于,如果所有的APP coder都可以将程序设置为不会被kill掉,为什么仅仅是微信不被kill?还是我们技术不过硬,没有找到不被系统kill的方法?

  总之,Android系统好乱,还是苹果大法好,大家都按规矩办事。

时间: 2024-10-04 16:21:45

解决Android后台清理APP后,程序自动重启的问题的相关文章

Android应用被卸载后,自动使用 浏览器打开指定连接

本文,提供"Android应用被卸载后,自动使用 浏览器打开指定连接"的方法. 原理:在安卓程序中某处,基于JNI调用C代码开启一个子进程监控应用在系统中的文件目录,一旦应用被卸载,该目录将会被系统删除,此时触发子进程执行相关代码(本例调用浏览器执行打开一个连接) 1.在安卓项目下创建jni目录 2.在jni目录下创建文件observer.c /* * Copyright (C) 2009 The Android Open Source Project * * Licensed und

解决Android Studio启动项目后一直处于refreshing 'View' gradle project,快速解决亲测有效

一直处于refreshing 'View' gradle project最根本的原因是项目中所用到的gradle版本在GRADLE_USER_HOME这个路径下没有找到,所以就利用distributionUrl这个路径进行下载,但是呢下载的时候会非常非常慢,So就一直卡在了refreshing 'View' gradle project 我的这个GRADLE_USER_HOME="C:\Users\Ivan\.gradle\wrapper\dists",大家可以根据自己的路径找到 要快

Ubuntu关机后会自动重启的解决方法

之前我装了ubuntu 14lts 开发版之后,本来用的好好的,但闲着没事更新了一下内核.之后就遇到ubuntu关机5秒后会自动重启这个问题,我有位用kilin的朋友也遇到这个问题.我反复研究发现,如果你的电脑插着U盘的话,关机是可以正常的,但这种方法不是很友好啊.之后,在贴吧看到最好的解决方法,只要联网状态下,在terminal输入如下命令即可解决. sudo apt-get install laptop-mode-tools Ubuntu关机后会自动重启的解决方法

C# 程序自动重启的解决方法

很多时候,我们有这样的场景,需要让程序自动重启,有很多种方法,比如用微软自带提供的方法,或者自己开辟新的线程重新调用.下面简单介绍两种方法. 方法一. 使用方法Application.Restart() 代码: 1 public static void Restart() 2 { 3 Application.Restart(); 4 } 当方法一使用的时候,经常报错或者启动不了的话(我就是碰到这种情况),我们可以使用第二种方法. 方法二. 1 public static void Restart

ubuntu16.04 springboot 断电后重启:程序自动重启

昨天客户现场说我的程序web页面404了. 我的答复是网络不通: 今天上午客户反映网络是通的,但是程序访问不了 客户把部署的服务器ip弄错了,并且服务器断电重启了.我的程序没有重启. nginx  springboot  程序没有自动重启[我现场重启,需要配置程序随着服务器开机自动启动] nginx 配置 1. 配置nginx 自动启动 vim /usr/lib/systemd/system/nginx.service [Unit] Description=nginx - high perfor

兔子--关不掉的App,或者是自动重启

1..多数APP点击两次退回可以关闭,算是最好的: 2..有些退出后关不掉,但用专门的管理软件可以关掉,次之: 3..有些是拿管理工具也关不掉的,在后台悄悄运行,极其恶劣. 三者大致比例是6:3:1. Android系统以开放而著称,这也是他吸引众多开发者的重要原因.在它提供给开发者的众多便利中,其中有一条:系统允许第三方开发者开发系统级的程序驻留后台.这本来是为程序开发者提供方便的措施,但是在国内却被一些人盯上了. 会选择让程序自动驻留后台,在被关掉后自动重启,有些甚至无法卸载,成为永不停止的

解决android有的手机拍照后上传图片被旋转的问题

转至 http://blog.csdn.net/walker02/article/details/8211628 需求:做仿新浪发微博的项目,能够上传图片还有两外一个项目用到手机拍摄图片,这两个都需要把图片上传到服务器 遇到问题:有的手机拍摄的图片旋转90度,有的图片旋转了180度,有的手机是正常的,服务器要求的是正的,这样问题就来了,不能用户发个照片在微博上看到的是被旋转了的啊,另外一个项目里旋转了的图片直接匹配出现问题,这个更严重. 解决:开始的时候在网上没有找到很好的解决办法,谷歌百度的搜

解决Android工程里的xml文件自动提示问题

在Window->Preferences->XML->XML Files->Editor->Content Assist右边的Prompt when these characters are inserted: 把默认的“<=:”改成 “<=:.abcdefghijklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ(,”. 上面改后还是没用,关键在于打开方式: PS:Java

c# ADO连接Access 执行Open后程序自动退出

今天利用ADO连接Access数据库的时候遇到了前所未见的问题,Access数据库连接串,OleDbConnection,open的时候,系统就会自动关闭所有调试. 我就很纠结了,这个AccessHelp是从以前写过的程序中拷贝过来的(不想引用太多的DLL,看着烦),调试以前的一切正常. 也想到了是不是版本的问题,access2003的连接串 “Provider=Microsoft.Jet.OLEDB.4.0”: access2007的连接串“Provider=Microsoft.ACE.OLE