Android,如何使应用程序的任务不可关闭?只能通过任务杀死关闭

Posted

技术标签:

【中文标题】Android,如何使应用程序的任务不可关闭?只能通过任务杀死关闭【英文标题】:Android, How to make the task of the app unclosable? Only closable by task killing 【发布时间】:2012-07-29 14:51:10 【问题描述】:

我正在开发一个必须始终运行并且只能通过任务杀手或类似工具关闭的应用程序。

我在清单中有:

android:persistent="true"

虽然按主页键时没有关闭,但我发现它有时会关闭,我不希望发生这种情况。

我的用户想要,可以通过从自定义启动器中终止应用程序或使用任务杀手来关闭应用程序。

有什么建议吗?提前致谢

P.D.:如何使用后退按钮退出应用程序,但不关闭它,我的意思是停止显示应用程序或其任何活动,但应用程序应继续在后台运行。

我写了一个服务,但有些东西不能正常工作我在清单中添加了这个

<service android:name=".ONService"></service>

就在应用标签结束之前,这是ONService.java:

package com.omninotifier.main;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;

public class ONService extends Service

@Override
public IBinder onBind(Intent intent) 
    // TODO Auto-generated method stub
    return null;



@Override
public void onCreate() 
    // TODO Auto-generated method stub
    //super.onCreate();




@Override
public int onStartCommand(Intent intent, int flags, int startId) 
    // TODO Auto-generated method stub
    //return super.onStartCommand(intent, flags, startId);

    return START_STICKY;


@Override
public void onDestroy() 
    // TODO Auto-generated method stub

    NotificationManager manager = (NotificationManager)     
getSystemService(Context.NOTIFICATION_SERVICE);
    Notification notification = new Notification(R.drawable.ic_stat_alert,   
getResources().getString(R.string.ServiceDestroyed), System.currentTimeMillis());
    notification.flags = Notification.FLAG_AUTO_CANCEL;
    manager.notify(150, notification);

    super.onDestroy();


 

我启动服务,应用程序启动时这样做是正确的:

这是应用中的主要活动

@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);


   Intent serviceIntent = new Intent();
   serviceIntent.setAction(".ONService");
   startService(serviceIntent);

//............


我应该在服务标签中添加带有操作的意图过滤器以使其工作吗?还是其他问题?

问题是它无法启动服务。这是修复:

在清单中

<service android:name=".ONService">
<intent-filter android:priority="100">
    <action android:name=".ONService"/>
</intent-filter>
</service>

在调用服务的活动中:

Intent serviceIntent = new Intent(".ONService");


startService(serviceIntent);

【问题讨论】:

应用程序实际上永远不会打开或关闭。这是一种错觉,只有 Android 正在运行,它会根据自己的算法路由到活动、服务,但要实现您想要的效果,请在下面查看我的答案。 【参考方案1】:

要让您的应用在关闭后继续运行,您需要在应用内部创建一个服务来执行您希望在后台发生的任何事情。

如果您是开发 Android 应用程序的新手,您可能需要查看以下 Android 服务教程:http://www.vogella.com/articles/AndroidServices/article.html。此外,我发现 Android 文档非常有帮助。我建议您阅读API Guide for Services 和API Reference for the Service class。

【讨论】:

【参考方案2】:

编写服务。您的应用程序与服务通信。当您的应用退出时,服务仍会运行。

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

【讨论】:

我对android中的服务一无所知,我会看到它,如果它有效,我会将你的答案设置为我接受的答案谢谢! App Activity 和 Service 的生命周期不同。在 Service 中使用 startForeground() 以延长使用寿命【参考方案3】:

我正在开发一个必须始终运行并且只能通过任务杀手或类似工具关闭的应用程序。

这在严格意义上是不可能的。 Android 可以并且最终会摆脱您的进程,以防止草率的开发人员试图拥有“必须始终运行的应用”。

如果您的应用程序是前台用户体验的一部分(例如,音乐播放器),您可以拥有一个调用 startForeground() 的服务,这可以降低 Android 摆脱您的进程的几率,只要有一个Notification 在与您的应用关联的状态栏中。您的应用最终仍会终止其进程,尽管它往往需要更长的时间。

或者,您可以自定义构建 Android 操作系统,其中包含一个 C 守护程序来实现您的逻辑,并分发一个包含您定制的 Android 的 ROM 模块。

【讨论】:

【参考方案4】:

结合使用 Service、AlarmManager 和 BroadcastReceiver。 AlarmManager 发出一个脉冲,BCReceiver 会根据需要每隔一段时间捕获并启动服务。这将实质上使服务无休止地活着,因为 Android 会看到它会定期被使用。从技术上讲,您的应用程序的生命周期,服务受 androids 控制,但您可以启动服务粘性,这有助于并定期调用它。 AlarmManager 非常可靠。

【讨论】:

【参考方案5】:

如果您需要随时运行,请查看Service 和startForeground。如果您可以让您的服务死掉但重新启动,请查看onStartCommand 和START_STICKY。

【讨论】:

以上是关于Android,如何使应用程序的任务不可关闭?只能通过任务杀死关闭的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI 中使模态不可关闭

Android 隐藏最近任务栏,使Activity 不在最近任务栏显示

使 Google 登录对话框不可取消

怎样使一个Android应用不被杀死

使用 tkinter 的不可关闭的窗口

SBT - 如何使 InputTask 依赖于一个任务并最终完成另一个