怎么让Android程序一直后台运行,像QQ一样不被杀死

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么让Android程序一直后台运行,像QQ一样不被杀死相关的知识,希望对你有一定的参考价值。

强烈建议不要这么做,不仅仅从用户角度考虑,作为Android开发者也有责任去维护Android的生态环境。现在很多Android开发工程师,主力机居然是iPhone而不是Android设备,感到相当悲哀。

从技术角度概括一下现在普遍的防杀方法Service设置成START_STICKY,kill 后会被重启(等待5秒左右),重传Intent,保持与重启前一样通过 startForeground将进程设置为前台进程,做前台服务,优先级和前台应用一个级别,除非在系统内存非常缺,否则此进程不会被 kill双进程Service:让2个进程互相保护,其中一个Service被清理后,另外没被清理的进程可以立即重启进程QQ黑科技:在应用退到后台后,另起一个只有 1 像素的页面停留在桌面上,让自己保持前台状态,保护自己不被后台清理工具杀死在已经root的设备下,修改相应的权限文件,将App伪装成系统级的应用(Android4.0系列的一个漏洞,已经确认可行)Android系统中当前进程(Process)fork出来的子进程,被系统认为是两个不同的进程。当父进程被杀死的时候,子进程仍然可以存活,并不受影响。鉴于目前提到的在Android-Service层做双守护都会失败,我们可以fork出c进程,多进程守护。死循环在那检查是否还存在,具体的思路如下(Android5.0以下可行)用C编写守护进程(即子进程),守护进程做的事情就是循环检查目标进程是否存在,不存在则启动它。在NDK环境中将1中编写的C代码编译打包成可执行文件(BUILD_EXECUTABLE)。主进程启动时将守护进程放入私有目录下,赋予可执行权限,启动它即可。联系厂商,加入白名单
参考技术A 可以使用Service运行,sevice就是在后台运行的进程。
Android中,当Service被kill后,如果重启需要使用BroadcastReceiver来实现,即广播接收者,例如利用BroadcastReceiver注册网络广播或者开关机广播,当接收到广播后直接启动service,这样就可以保证service被kill后,自动启动。
实现代码:
1.在配置文件AndroidManifest.xml中向系统注册BroadcastReceiver
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>

2.需要添加相应权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

3.在Receiver中就可以添加开机,或者网络状态改变后需要进行的操作
public class BootCompletedReceiver extends BroadcastReceiver
@Override
public void onReceive(Context context, Intent intent)



4.执行操作,Intent intent = new Intent(context,Service.class); context.startService(intent); 这样即可开机,或者网络状态改变后启动Service了。
参考技术B 在设置里面,有一个运行白名单,把你需要的软件设置在白名单内,也可以不被停止运行 参考技术C service百度一下啊 参考技术D 这个涉及到其他的知识了

如何在后台运行android应用程序时显示通话屏幕

【中文标题】如何在后台运行android应用程序时显示通话屏幕【英文标题】:how to show call screen while android app running on background 【发布时间】:2012-03-09 13:53:29 【问题描述】:

我正在为 android 2.3.3 制作一个 SIP 应用程序。我可以给某人打电话,当有人给我打电话时会显示我的“来电屏幕”。但是当我的应用程序在后台运行并且有人打电话给我时,“通话屏幕”没有启动。那么我怎样才能让它像正常来电一样启动。

已修复:

清单:在应用标签中添加以下代码

  <receiver android:name=".ReceiverTest" android:enabled="true">
             <intent-filter>
                 <action android:name="com.example.INCOMING_CALL" />
             </intent-filter>
  </receiver>

Receiver类:当我接到电话时,它会打开我的来电页面

public class ReceiverTest extends BroadcastReceiver

    @Override
    public void onReceive(Context arg0, Intent arg1)   
        ...
        Intent nextPage= new Intent("com.example.IncomingPage");
        nextPage.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        arg0.startActivity(nextPage);   
            ...     
    


【问题讨论】:

您说的是传入的 SIP 呼叫还是 VOICE 呼叫? 【参考方案1】:

如果您使用的是 Activity,则您的应用不会在后台运行。当一个新的活动被带到堆栈的顶部时,您的应用程序将暂停并放置在后台。要允许您的应用程序接收任何类型的通知,请尝试运行服务或创建广播接收器来获取您想要侦听的意图。这允许您的应用在不在堆栈顶部时进行处理。

更新

所以你已经注册了一个广播接收器......这很好......但是......如果你在你的活动中注册了它并且活动被杀死了,那么你的应用程序的引用和虚拟机也是如此,并且意图不是已收到。尝试使您的广播接收器独立于活动(即让系统使用清单调用它)。然后,即使您的应用程序已死,您的广播接收器也可以接收意图,并启动您需要的内容。

另一种方法是创建一个注册您的接收器的服务 - 一个服务可以在后台运行,但您必须担心让您的服务足够轻而不会被杀死(更多技巧)。最好的是选项 1(开销更少)。

【讨论】:

我认为你不了解我,或者我不了解你。让我解释一下这种方式。我运行我的应用程序,然后注册我的广播接收器以接收来电,它在我的应用程序中运行良好。如果我按下“主页按钮”,我的应用程序会进入后台,但我仍然可以接听电话,现在问题来了,我希望我的应用程序出现在屏幕上,以便我可以拒绝或接听电话。 我明白你在说什么。当您的应用程序在后台运行时,当有人呼叫您时,您的呼叫屏幕不会显示。再次......在后台运行的应用程序出于所有目的都是“死的”,除非有一个广播接收器可以获取来电的意图,或者一个正在检测它的服务。阅读更新以获取更多信息.... 哦,现在我知道你的意思了,谢谢你的理解

以上是关于怎么让Android程序一直后台运行,像QQ一样不被杀死的主要内容,如果未能解决你的问题,请参考以下文章

怎么让 Android 程序一直后台运行,像 QQ 一样不被杀死

怎么让Android程序一直后台运行,像QQ一样不被杀死

怎么让 Android 程序一直后台运行,像 QQ 一样不被杀死

什么是后台运行

如何让我的 android 应用程序在后台运行?

如何让android的service一直在后台运行