android如何做到类似于微信那样后台服务不会被杀死?

Android 码拜 5年前 (2015-04-24) 151次浏览 0个评论
 

正在做一款锁屏应用。
做锁屏肯定用到了service,可是我发现每日手动点击自带的内存清理按钮的时候,我的那个service总是会被杀死。
而微信的后台服务却是一直正常的运行,不会被杀掉。
360的话也不会被杀死,但是360会重新启动。而且360的是两个后台服务,我猜有可能会相互作用的,杀死一个的时候另一个接收到广播把其重启。
尝试过用startForeground以及提高service优先级的方式,发现都不行,service都会被杀死。
反编译了一下微信的代码。
请大家帮忙想想办法吧。谢了
下面是微信的注册service:

<service
			android:name="com.tencent.mm.booter.CoreService"
			android:process=":push"
			>
		</service>

代码如下:

public class CoreService extends Service
  implements com.tencent.mm.jni.platformcomm.f, af, bl
{
  private ao bZl;
  private ac bZm = new ac();
  private boolean bZn = true;
  public final int bZo = -1213;
  private final ai bZp = new e(this);
  private com.tencent.mm.modelstat.l bZq = null;
  private AddrBookObserver bZr;
  private WatchDogPushReceiver bZs;
  private WakerLock bZt = null;
  private m bZu = new m();
  private ay bZv = new ay(new g(this), false);

  private void oj()
  {
    aa.w("MicroMsg.CoreService", "[COMPLETE EXIT]");
    bk.Fg().d(3, 10000, "");
    bg.onDestroy();
    try
    {
      MMReceivers.AlarmReceiver.D(getApplicationContext());
      MMReceivers.AlarmReceiver.B(getApplicationContext());
      Alarm.H(getApplicationContext());
      label43: aa.appenderClose();
      Process.killProcess(Process.myPid());
      return;
    }
    catch (Exception localException)
    {
      break label43;
    }
  }

  public final void H(boolean paramBoolean)
  {
    if (!paramBoolean)
    {
      aa.w("MicroMsg.CoreService", "[NETWORK LOST]");
      bk.Fc().cFB = false;
      bk.Fd().eJ(0);
      bk.Fb().a(10502, "", null);
      this.bZn = false;
      return;
    }
    aa.w("MicroMsg.CoreService", "[NETWORK CONNECTED]");
    bk.Fc().cFB = true;
    boolean bool = this.bZm.oM();
    if ((this.bZn) && (!bool))
    {
      Object[] arrayOfObject = new Object[1];
      arrayOfObject[0] = Boolean.valueOf(this.bZn);
      aa.d("MicroMsg.CoreService", "network not change or can""t get network info, lastStatus connect:%b", arrayOfObject);
      return;
    }
    if (bool)
      bk.Ff().EN();
    this.bZn = true;
    bk.Fd().eJ(1);
    bk.Fb().a(10501, "", null);
    if (this.bZt == null)
      this.bZt = new WakerLock(getApplicationContext());
    if (!this.bZt.isLocking())
      this.bZt.lock(14000L);
    aa.i("MicroMsg.CoreService", "checking ready, start in 7000ms");
    this.bZv.bO(7000L);
  }

  public final boolean a(int paramInt, byte[] paramArrayOfByte)
  {
    if (getSharedPreferences("system_config_prefs", com.tencent.mm.compatible.g.l.qi()).getBoolean("settings_fully_exit", true))
    {
      aa.i("MicroMsg.CoreService", "fully exited, no need to notify worker");
      return false;
    }
    Intent localIntent = new Intent(this, NotifyReceiver.class);
    localIntent.putExtra("notify_option_type", 2);
    localIntent.putExtra("notify_uin", this.bZl.ES().sd());
    localIntent.putExtra("notify_respType", paramInt);
    localIntent.putExtra("notify_respBuf", paramArrayOfByte);
    localIntent.putExtra("notfiy_recv_time", cj.FD());
    localIntent.putExtra("notify_skey", this.bZl.ES().uo());
    aa.i("MicroMsg.CoreService", "notify broadcast:" + localIntent.getAction() + ", type=" + paramInt);
    try
    {
      sendBroadcast(localIntent);
      return true;
    }
    catch (Exception localException)
    {
      while (true)
      {
        Object[] arrayOfObject = new Object[1];
        arrayOfObject[0] = localException.toString();
        aa.a("MicroMsg.CoreService", "onNotify hasDestroyed %s", arrayOfObject);
      }
    }
  }

  public IBinder onBind(Intent paramIntent)
  {
    aa.d("MicroMsg.CoreService", "onBind~~~ threadID:" + Thread.currentThread());
    return this.bZl;
  }

  public void onCreate()
  {
    aa.d("MicroMsg.CoreService", "onCreate~~~threadID:" + Thread.currentThread());
    super.onCreate();
    if (Build.VERSION.SDK_INT < 18)
      startForeground(-1213, new Notification());
    Handler localHandler = new Handler(Looper.getMainLooper());
    PlatformComm.a(al.getContext(), localHandler);
    i locali = new i(this);
    locali.om();
    ag.a(this.bZp);
    if (PlatformComm.cgz == null)
      PlatformComm.cgz = this;
    bk.a(localHandler);
    bk.setContext(getApplicationContext());
    bk.a(new bm());
    bk.a(new bn());
    bk.a(this);
    if (this.bZq == null)
      this.bZq = new com.tencent.mm.modelstat.l();
    bk.a(this.bZq);
    this.bZl = bk.Ff();
    if (this.bZl == null)
    {
      aa.i("MicroMsg.CoreService", "autoAuth is null and new one");
      this.bZl = new ao(bk.getHandler());
      bk.e(this.bZl);
      bg.onCreate();
      if (bk.Fg() != null)
        break label465;
      aa.i("MicroMsg.CoreService", "NetTaskAdapter is null and new one");
      bk.a(new bi());
      label228: if (bk.Fh() == null)
      {
        aa.i("MicroMsg.CoreService", "NetTaskAdapter is null and new one");
        bk.a(new bh());
        bk.Fh().cFn = this;
      }
      at.azE().a(new f(this), null);
      String str1 = locali.getString(".com.tencent.mm.debug.server.host.http");
      String str2 = locali.getString(".com.tencent.mm.debug.server.ports.http");
      String str3 = locali.getString(".com.tencent.mm.debug.server.host.socket");
      String str4 = locali.getString(".com.tencent.mm.debug.server.ports.socket");
      this.bZl.d(str1, str2, str3, str4);
      MMReceivers.AlarmReceiver.D(getApplicationContext());
      MMReceivers.AlarmReceiver.C(getApplicationContext());
      NetworkInfo localNetworkInfo = ((ConnectivityManager)getSystemService("connectivity")).getActiveNetworkInfo();
      if ((localNetworkInfo != null) && (localNetworkInfo.getState() == NetworkInfo.State.CONNECTED))
        break label482;
      bk.Fc().cFB = false;
      bk.Fd().eJ(0);
    }
    while (true)
    {
      this.bZr = new AddrBookObserver(this, new Handler());
      getContentResolver().registerContentObserver(c.aph(), true, this.bZr);
      this.bZs = new WatchDogPushReceiver();
      registerReceiver(this.bZs, new IntentFilter("com.tencent.mm.WatchDogPushReceiver"));
      return;
      aa.w("MicroMsg.CoreService", "autoAuth is not null and reset");
      this.bZl.reset();
      break;
      label465: aa.w("MicroMsg.CoreService", "NetTaskAdapter is not null and reset");
      bk.Fg().reset();
      break label228;
      label482: bk.Fc().cFB = true;
      bk.Fd().eJ(1);
    }
  }

  public void onDestroy()
  {
    aa.d("MicroMsg.CoreService", "onDestroy~~~ threadID:" + Thread.currentThread());
    this.bZq.a(10002, null, null);
    getContentResolver().unregisterContentObserver(this.bZr);
    unregisterReceiver(this.bZs);
    super.onDestroy();
    oj();
  }

  public void onRebind(Intent paramIntent)
  {
    aa.d("MicroMsg.CoreService", "onRebind~~~ threadID:" + Thread.currentThread());
    super.onRebind(paramIntent);
  }

  public boolean onUnbind(Intent paramIntent)
  {
    aa.d("MicroMsg.CoreService", "onUnbind~~~ threadID:" + Thread.currentThread());
    bk.Fc().a(null);
    return super.onUnbind(paramIntent);
  }

  public final void restartProcess()
  {
    aa.w("MicroMsg.CoreService", "restartProcess");
    oj();
  }
}
android如何做到类似于微信那样后台服务不会被杀死?

注意内存使用量,内存使用的越多越容易被杀死。

android如何做到类似于微信那样后台服务不会被杀死?
我知道原因了,
微信这个应用根本没有退出。而是在后台运行着,
微信使用的是bindService,由于应用没有退出。所以不会内存管理器被杀死。
所以,请教一下360的原理。
android如何做到类似于微信那样后台服务不会被杀死?
引用 1 楼 hslinux 的回复:

注意内存使用量,内存使用的越多越容易被杀死。

用户内存使用的多或少是用户的选择,对于开发者来说,能做的就是保证自己的服务优先不被杀死,

android如何做到类似于微信那样后台服务不会被杀死?

如果是处于前台的程序,内存会受用户操作的影响,但是,当程序处于后台的时候,内存的使用,基本上可以由程序员来控制。

android如何做到类似于微信那样后台服务不会被杀死?
50分

android 系统杀程序,一个很重要的判断就是软件系统资源的占用情况。

android如何做到类似于微信那样后台服务不会被杀死?
最终了解了一下,微信不会杀死的原因是小米系统用的是腾讯管家模块进行关系的,
所以进行内存清理的时候,自带的系统自然不会清理微信的产品了。
但是360手机卫士虽然被清理掉了,但是能自动重启,这点真的很厉害。正在研究中
android如何做到类似于微信那样后台服务不会被杀死?
50分
mark一下,等待结果
android如何做到类似于微信那样后台服务不会被杀死?
我最近也在研究 能不能留下联系方式 互相交流下
android如何做到类似于微信那样后台服务不会被杀死?
有结论吗?按理说android3.1之后这些应用一旦被杀死,就接收不到系统静态广播了,不知道为什么还有那么多应用能做到开机自启动。
android如何做到类似于微信那样后台服务不会被杀死?
360向谷歌缴费 对谷歌说请你不要杀死我行不。谷歌说ok 。就这么简单。
android如何做到类似于微信那样后台服务不会被杀死?
你解决了吗,我也在弄这方面功能
android如何做到类似于微信那样后台服务不会被杀死?
有结论了吗?最近app也需要这种功能
android如何做到类似于微信那样后台服务不会被杀死?
试下双服务…………
android如何做到类似于微信那样后台服务不会被杀死?
大哥,这句是关键startForeground(-1213, new Notification());,谁用谁知道
android如何做到类似于微信那样后台服务不会被杀死?
请问,问题解决了吗,我发现,用一键清理也干不掉微信,微博都被搞掉了;
微信是怎么做到的呢
android如何做到类似于微信那样后台服务不会被杀死?
楼主解决了吗 
android如何做到类似于微信那样后台服务不会被杀死?
呃呃 怎么反编译的程序啊,这么厉害 求指教
android如何做到类似于微信那样后台服务不会被杀死?
网上常见的 都试过了 效果不不是很好 真心搞不懂 为什么有些APP 确实能够在被杀死的情况下 自动启动 谁知道怎么做 麻烦说下 交流下972632491
android如何做到类似于微信那样后台服务不会被杀死?
其实这个问题早就解决了,只不过忘了回来解释一下了。。
微信杀不掉的原因并不是它本身用了什么特殊的技术,只是因为和小米系统签订了合同,所以不会被杀掉,有兴趣的人可以做个试验,做个工程和微信一样的主包名,然后服务名也一样的话,看看是否会被杀掉。
想解决这方式,两种方法
第一,引导用户赋予应用自启动的权限,并且修改
service方法中
onStartCommand的flags=1,这样即使被杀掉,也会在被杀掉后重新自启动的。
第二,把应用刷成系统级的应用。
android如何做到类似于微信那样后台服务不会被杀死?
楼主能说的详细点么? 最近也遇到类似的问题了。试了很多种方式, miui自带的还是能把我的后台service杀掉。引导用户赋予应用自启动的权限? 这个要怎么实现?
android如何做到类似于微信那样后台服务不会被杀死?
经过测试发现,360清理大师 : 只有微信电话本杀不掉里面的一个服务外,其他的应用,用360清理大师都可以杀掉服务.
android如何做到类似于微信那样后台服务不会被杀死?
能发下源码不 楼管lys221221@163.com
android如何做到类似于微信那样后台服务不会被杀死?
楼主 能发下源码吗?最近也在研究这个问题 弄了几天了 一直没有点头绪,请教一下,希望分享下,谢谢 QQ:809108038 邮箱809108038@qq.com  谢谢楼主了
android如何做到类似于微信那样后台服务不会被杀死?
看看,正遇到这个问题
android如何做到类似于微信那样后台服务不会被杀死?
请问楼主这个问题解决了嘛?
android如何做到类似于微信那样后台服务不会被杀死?
楼主可以给一下具体的资料看看怎么实现的原理吗?1324694009@qq.com.O(∩_∩)O谢谢。
android如何做到类似于微信那样后台服务不会被杀死?
楼主可以发一份参考代码给我吗?1689606425@qq.com ,最近项目也需要这方面的知识
android如何做到类似于微信那样后台服务不会被杀死?
招标求解决方案!
android如何做到类似于微信那样后台服务不会被杀死?
引用 19 楼 AA5279AA 的回复:

其实这个问题早就解决了,只不过忘了回来解释一下了。。
微信杀不掉的原因并不是它本身用了什么特殊的技术,只是因为和小米系统签订了合同,所以不会被杀掉,有兴趣的人可以做个试验,做个工程和微信一样的主包名,然后服务名也一样的话,看看是否会被杀掉。
想解决这方式,两种方法
第一,引导用户赋予应用自启动的权限,并且修改
service方法中
onStartCommand的flags=1,这样即使被杀掉,也会在被杀掉后重新自启动的。
第二,把应用刷成系统级的应用。

对你说的这两点我说一下,首先,微信不是系统级应用,否则是不能删掉的。
然后,非小米系统一样是删不掉。
你自己仔细去设置里面的后台进程观察一下就可以发现一些东西了。

android如何做到类似于微信那样后台服务不会被杀死?
如果一个系统或者360这样的软件,一键清理清理掉了微信qq,那么你第一反应是什么,作为一个用户,要么我会重刷系统或者我会直接写在了360,我还是觉得白名单的问题的存在
android如何做到类似于微信那样后台服务不会被杀死?
http://www.expreview.com/39438.html,这篇文章大家知道不,但是也不知道什么实现方法,不知道真假也不知道怎么弄
android如何做到类似于微信那样后台服务不会被杀死?
楼主,可以给一份具体的实现代码吗,619784760@qq.com   最近也一直在看这个,网上看了很多都没解决

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明android如何做到类似于微信那样后台服务不会被杀死?
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!