【发布时间】:2012-11-08 10:28:29
【问题描述】:
一开始,我想为糟糕的英语道歉。
这是我的问题:
我在 android 中有一个服务,它在活动运行时在后台运行。 (此服务以指定的时间间隔将用户数据与服务器同步)。
public class CService extends Service
{
private Boolean isDestroyed;
@Override
public int onStartCommand (Intent intent, int flags, int startId)
{
if (intent != null)
{
new Thread(new Runnable()
{
//run new thread to disable flush memory for android and destroy this service
@Override
public void run ()
{
this.isDestroyed = Boolean.FALSE
while(!this.isDestroyed)
{
//loop until service isn't destroyed
}
}
}).start();
}
return Service.START_NOT_STICKY;
}
@Override
public void onDestroy ()
{
//THIS ISNT CALLED FROM uncaughtException IN ACTIVITY BUT from onDestroy method is this called.
//when is service destroyed then onDestroy is called and loop finish
this.isDestroyed = Boolean.TRUE;
}
}
并且从 onCreateMethod 中的活动开始。该活动实现了 Thread.UncaughtExceptionHandler 并在 onCreate 方法中注册以捕获活动中的所有意外异常。当活动中的某些东西抛出异常方法 uncaughtException 被调用并且服务应该停止时 stopService(serviceIntent);但是服务中的 onDestoy 没有被调用。但是何时调用活动中的 onDestroy 方法(用户按下然后返回按钮)服务成功停止并调用 CService 中的 onDestoroy。
public class CActivity extends Activity implements Thread.UncaughtExceptionHandler
{
private Thread.UncaughtExceptionHandler defaultUEH;
@Override
protected void onCreate (Bundle savedInstanceState)
{
this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
// create intent for service
Intent serviceIntent = new Intent(this, CService.class);
// run service
startService(serviceIntent);
//set default handler when application crash
Thread.setDefaultUncaughtExceptionHandler(this);
super.onCreate(savedInstanceState);
}
@Override
public void uncaughtException (Thread thread, Throwable ex)
{
//THIS DOESN'T WORK
//when global exception in activity is throws then this method is called.
Intent serviceIntent = new Intent(this, CService.class);
//method to service stop is called. BUT THIS METHOD DON'T CALL onDestroy in CService
stopService(serviceIntent);
defaultUEH.uncaughtException(thread, ex);
}
@Override
public void onDestroy ()
{
//this work fine
Intent serviceIntent = new Intent(this, CService.class);
stopService(serviceIntent);
super.onDestroy();
}
}
我需要在活动崩溃时停止后台服务。因为当android关闭活动并在堆栈中启动前一个活动(即登录屏幕)时,现在没有用户登录。
感谢您的建议。
【问题讨论】:
-
您的服务是从另一个进程运行的吗?
-
服务从在 onCreate 方法中运行并在 uncaughtException 方法中运行的同一活动中运行和停止。
标签: android android-service ondestroy uncaught-exception uncaughtexceptionhandler