Android 后台服务和警报

Android background services and alarms

最近遇到一个问题,当 Android 4.4 杀死我的应用程序时 ServiceAlarmManager 当设备进入睡眠模式时(START_STICKY 参数没有帮助)。我尝试了很多东西,但没有任何东西能满足我的需要。

在我的任务管理器应用程序中,我总是看到很多非默认应用程序的进程,例如 Google+、Skype、Google Drive end 一些实时工作但从来没有的应用程序被系统杀死。

我想请教更多有经验的开发人员如何创建不会被系统杀死的ServiceAlarm,或者这在某些Android程序集上是不可能的?

这不是一种编程答案,因为不工作的原因不在您的代码中。两周前我也被这个绊倒了。我的服务总是停止,我一直不明白为什么,直到我在设置中检测到 "Power Saving" 选项(我的设备 Huawei Ascend Mate 7)导航:

设置 --> 省电 --> 顶部电源信息 --> 屏幕关闭后保持 运行ning。

在这里您可以启用或禁用应用程序,如果屏幕进入休眠状态,这些应用程序应该运行在后台运行。

此外,如果答案不正确,评论太长了,也许它可以帮助其他人解决这个问题。

我们对现有的应用程序执行此操作,以便即使按下主页按钮也能将用户留在我们的应用程序中。我稍微修改了代码,这样我就可以 post 举个例子了。我们是运行Android4.4.3.

您可以通过 运行 后台服务保留您的 activity 运行。您将任务放在设备的最前端。首先,获取任务Id并启动服务

public class MainActivity extends Activity { 
    @Override
    public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       int taskID = getTaskId();
       Intent intent = new Intent(this, ServiceKeepInApp.class);
       intent.putExtra("TaskID", taskId); 
       startService(intent);
    }
 }

您的服务 class,使用处理程序保持活动状态:

public class ServiceKeepInApp extends Service {

private boolean sendHandler = false;
private int taskID = -1;

Handler taskHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);

        ActivityManager activityManager = (ActivityManager)getSystemService(Service.ACTIVITY_SERVICE);
        if (taskID != -1) {
          if (activityManager.getRecentTasks(2, 0).get(0).id != taskID) {
              activityManager.moveTaskToFront(taskID, 0);
          }
        }

        if (sendHandler) {
            taskHandler.sendEmptyMessageDelayed(0, 1000);
        }
    }
};

@Override
public void onCreate() {
    Bundle extras = getIntent().getExtras();
    if (extras != null) {
       taskID = extras.getInt("TaskID");
    }
    super.onCreate();
    sendHandler = true;
    taskHandler.sendEmptyMessage(0);
}

@Override
public void onDestroy() {
    super.onDestroy();
    sendHandler = false;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
}

@Override
public IBinder onBind(Intent arg0) {
    return null;
}

}

这是未经测试的代码 - 所以买家要当心。