我有一个执行以下操作的IntentService:
protected void onHandleIntent(Intent intent) {
// TODO Auto-generated method stub
while (true) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Hello, World!");
}
}
以上是我正在使用的代码示例。我打算用发送到服务器的HTTP请求替换println(),但是现在我用它作为测试。我这样调用startService():
@Override
public void onPause() {
ConnectionUtility.getInstance().startService(this);
super.onPause();
}
@Override
public void onDestroy() {
ConnectionUtility.getInstance().startService(this);
super.onDestroy();
}
@Override
public void onStop() {
ConnectionUtility.getInstance().startService(this);
super.onStop();
}
我的自定义startService方法执行此操作:
public void startService(Activity activity) {
if (!isMyServiceRunning(activity)) {
Intent intent = new Intent(activity, BackgroundUpdateService.class);
activity.startService(intent);
}
}
注意:isMyServiceRunning()方法是我在别处找到的自定义方法,用于确定服务是否正在运行。据我所知,该方法有效。
现在,此服务的目的是在特定Activity退出时(通过onPause(),onDestroy()或onStop())触发println(),并且当onCreate()或onResume()运行时,服务将如此停止:
@Override
public void onResume() {
ConnectionUtility.getInstance().stopServiceIfRunning(this);
super.onResume();
}
更深入了解stopServiceIfRunning():
public void stopServiceIfRunning(Activity activity) {
if (isMyServiceRunning(activity)) {
Intent intent = new Intent(activity, BackgroundUpdateService.class);
activity.stopService(intent);
}
}
现在问题出现了:我可以启动服务,当我通过Home / Back按钮退出Activity时,或者当我切换到不同的Activity时,startService()方法启动并且运行完美;也就是说,“你好,世界!”根据需要每隔5秒打印一次。但是当我导航回Activity时,我可以确定我的自定义stopServiceIfRunning()方法运行并且代码很好地进入了IF块(已确认),但是服务没有停止并且“Hello,World!”只是保持不变未来。我做错了什么?
--- --- EDIT 回应塞拉芬的评论:
private boolean isMyServiceRunning(Activity activity) {
ActivityManager manager = (ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE);
for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (BackgroundUpdateService.class.getName().equals(service.service.getClassName())) {
return true;
}
}
return false;
}
但同样,这个方法到目前为止准确地返回了真值和假值,所以我认为这不是问题。
答案 0 :(得分:2)
终于找到了办法,非常感谢塞拉芬帮助我这么多。
我最终覆盖了我的自定义IntentService类的onDestroy()方法。这就是我想出的:
public class BackgroundUpdateService extends IntentService {
private boolean status;
public BackgroundUpdateService() {
super("BackgroundUpdateService");
// TODO Auto-generated constructor stub
}
@Override
protected void onHandleIntent(Intent intent) {
status = true;
// TODO Auto-generated method stub
while (status) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Hello, World!");
}
}
@Override
public void onDestroy() {
status = false;
super.onDestroy();
}
}
显然,每当调用.stopService(intent)时都会调用onDestroy()方法,所以我利用这个事实来阻止while循环。这避免了可靠性问题,因为每个Service都有自己的布尔变量,并且不依赖于静态变量,并且不需要通过Intent传递任何其他变量。
再次感谢Seraphim花时间帮助我。
答案 1 :(得分:0)
停止服务不是同步操作。如果您的服务终止检查接近上一次“服务停止”呼叫,您可能会发现您的服务仍在运行。
在我需要停止服务的应用程序中(退出应用程序时)我进入循环周期(使用AsyncTask)并等待服务终止。
我看到你打电话了
@Override
public void onDestroy() {
ConnectionUtility.getInstance().startService(this);
super.onDestroy();
}
我建议您使用Application Context
来启动和停止服务,而不是将Activity
用作context
。因为当活动即将被销毁时你就开始服务了!
也是部分
protected void onHandleIntent(Intent intent) {
// TODO Auto-generated method stub
while (true) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Hello, World!");
}
}
处理意图时的无限循环?听起来不太好。