Android 后台服务和警报
Android background services and alarms
最近遇到一个问题,当 Android 4.4
杀死我的应用程序时 Service
和 AlarmManager
当设备进入睡眠模式时(START_STICKY
参数没有帮助)。我尝试了很多东西,但没有任何东西能满足我的需要。
在我的任务管理器应用程序中,我总是看到很多非默认应用程序的进程,例如 Google+、Skype、Google Drive end 一些实时工作但从来没有的应用程序被系统杀死。
我想请教更多有经验的开发人员如何创建不会被系统杀死的Service
或Alarm
,或者这在某些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;
}
}
这是未经测试的代码 - 所以买家要当心。
最近遇到一个问题,当 Android 4.4
杀死我的应用程序时 Service
和 AlarmManager
当设备进入睡眠模式时(START_STICKY
参数没有帮助)。我尝试了很多东西,但没有任何东西能满足我的需要。
在我的任务管理器应用程序中,我总是看到很多非默认应用程序的进程,例如 Google+、Skype、Google Drive end 一些实时工作但从来没有的应用程序被系统杀死。
我想请教更多有经验的开发人员如何创建不会被系统杀死的Service
或Alarm
,或者这在某些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;
}
}
这是未经测试的代码 - 所以买家要当心。