如何在后台运行安卓应用?

26

这段代码可以在系统启动后自动运行一个应用程序,但是当按下返回按钮后,该应用程序将关闭。

如果通过点击它的图标正常运行该应用程序,即使按下返回按钮或运行其他应用程序,它也将持续运行。

public class AutoBoot extends BroadcastReceiver {
    @Override        
    public void onReceive(Context context, Intent intent) {                
        Intent i = new Intent(context, MyActivity.class); 
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(i);          
    }
}

我的问题是,如何使这段自动运行的代码在按下返回按钮或运行其他应用程序后仍然持续运行?

3个回答

17

如果你希望你的应用程序在后台运行,你可以在这里启动一个Service。在Android中使用Service来在后台执行长时间操作。

更新

你可以使用START_STICKY使你的Service持续运行。

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    handleCommand(intent);
    // We want this service to continue running until it is explicitly
    // stopped, so return sticky.
    return START_STICKY;
}

1
它将如何被明确地停止? - Ruchir Baronia
另外,如何在重启后启动服务? - Ruchir Baronia
如果电池的耗电量很高,该如何解决这个问题? - Arslan Maqbool

5
由于应用程序通常在后台运行,因此我认为您真正想知道的是如何使应用程序在后台执行任务。以下解决方案将使您的应用程序在打开应用程序并系统重启后在后台执行任务。
下面,我添加了一个链接到完全可用的示例(以Android Studio项目的形式呈现)。
这个主题似乎超出了Android文档的范围,并且似乎没有任何一篇综合性的文档涵盖了所有内容。信息分散在几篇文档中。
以下文档间接告诉您如何实现此操作:

https://developer.android.com/reference/android/app/Service.html

https://developer.android.com/reference/android/content/BroadcastReceiver.html

https://developer.android.com/guide/components/bound-services.html

为了正确理解您的使用需求,需要仔细阅读上述文档中的重要部分:#Binder、#Messenger以及下方的组件链接。

https://developer.android.com/guide/components/aidl.html

这是一个完全可用的示例链接(以Android Studio格式):

https://developersfound.com/BackgroundServiceDemo.zip

这个项目将启动一个Activity,它会绑定到一个实现了AIDL的服务。

这个项目也非常有用,可以重构为在不同应用之间进行IPC。

这个项目还可以在安卓系统重新启动时自动启动(前提是应用程序至少在安装后运行过一次,并且不安装在SD卡上)。

当这个应用/项目在重启后运行时,它会动态使用透明视图,使其看起来像没有应用程序启动,但相关应用程序的服务会干净地启动。

这段代码编写得非常易于调整,以模拟计划服务。

这个项目是按照上述文档开发的,因此是一个干净的解决方案。

然而,这个项目中有一部分并不干净:我没有找到一种在没有使用Activity的情况下启动服务的方法。如果阅读此帖子的任何人有一种干净的方法,请发表评论。


谢谢 - 我非常有兴趣学习这个。我已经在Android Studio中开发Android应用程序将近1年了。我下载了你的zip文件,将其放在一个目录中,在Android Studio中打开该目录并在构建时收到了以下错误信息。错误:配置项目':app'时出现问题。
无法解决配置':app:_debugApkCopy'的所有依赖项。 找不到com.android.support.constraint:constraint-layout:1.0.2。 需要: 项目:app
- Frank Zappa
我猜测你的其中一个布局文件在使用约束布局,但是约束布局的依赖并没有在你的gradle文件中。如果不是这种情况,请将布局文件中的约束布局更改为普通布局,并且如果布局中有任何与约束布局相关的属性,请将其删除。 - user2288580
当新的Gradle版本发布时,通常会出现迁移问题。解决这个问题的最佳方法是使用相同的包名创建一个新项目,并将项目文件分别迁移过去。对于造成的不便我们深表歉意。该应用程序经过了彻底的测试,因此可以正常工作。 - user2288580

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接