我正在尝试编写一个示例Android服务代码来测试服务是否在将START_NOT_STICKY返回到onStartCommand后停止。但我随时关闭我的应用程序,服务停止,而根据规则START_NOT_STICKY将不允许自动停止服务。
MyCode:
ServiceDemo.java
package com.example.servicedemo;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent in = new Intent(this,TrackService.class);
startService(in);
}}
TrackService.java
package com.example.servicedemo;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class TrackService extends Service
{
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public int onStartCommand(Intent intent, int flags , int startId)
{
return START_NOT_STICKY;
}
@Override
public boolean onUnbind(Intent intent)
{
return super.onUnbind(intent);
}}
这是我的上述代码,每当我关闭我的应用程序时,应用程序服务自行停止,请帮助我,我如何限制我的服务停止或重新启动。
答案 0 :(得分:1)
关闭我的应用程序意味着,按住主页并从幻灯片菜单向上滑动应用程序以完全关闭
这意味着您要终止后台进程。此时,您的服务已经消失,而且由于您要返回START_NOT_STICKY
,它将不会自动重启。
换句话说,正在发生的事情是完全正常的。
答案 1 :(得分:0)
使用滑动关闭不会终止此代码。
这是一个在前台运行的服务,因此android会将其视为在屏幕上。它在一个单独的过程中运行,因此可以杀死主进程。它会在用户运行时向用户显示一个自定义通知,以便完全连接并写入。
注意Eclipse ADK用户仅在完成调试后将服务放在不同的进程中。
清单
<service
android:name="com.gosylvester.bestrides.ServiceLocationRecorder"
android:process=":myService" >
</service>
</application>
MyService类
private boolean isRecording = false;
public int onStartCommand(Intent intent, int flags, int startId) {
boolean isTrackerMarker = SettingMarker.TRACKER_MARKER_DEFAULT;
if (intent != null) {
isRecording = intent.getBooleanExtra("isrecording", isRecording);
startRecording(isRecording);
}
//if isRecording keep the service running else let os know service can be killed
if (isRecording) {
startForeground(R.id.action_record, getMyCustomNotification());
return Service.START_STICKY;
} else {
stopForeground(true);
return Service.START_NOT_STICKY;
}
}
答案 2 :(得分:0)
重新创建服务 ,只是不重新启动。
如果您覆盖onCreate
并执行Log.d或Toast,您将看到在活动和应用程序被破坏甚至服务onDestroy
被调用之后,onCreate会被调用。
因此重新创建后使其保持运行的诀窍是将代码置于onCreate
方法上,并仅将onStartCommand
用于{{1} }。
注意:onCreate在onStartCommand之前调用,因此您的代码在由startService启动时以及从系统自动创建时都将运行。