在我的应用程序中,我使用以下代码在后台运行服务。
Service myser=new Intent(EmailRegistrationActivity.this, BackgroundService.class);
startService(myser);
在我的服务类中,我正在使用AsyncTask类。在那个AsyncTask类中,我必须从设备获取sms和mms并发布到我的本地服务器。在进程之间,用户想要注销。所以在那个注销方法中我想停止服务。
这是服务类
public class BackgroundService extends Service{
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
super.onCreate();
}
@SuppressLint("NewApi")
public int onStartCommand(Intent intent, int flags, int startId) {
if(startId>1)
{
if(CheckInternetConnection.isOnline(BackgroundService.this))
{
dob=new Doinback();
dob.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}else{
//check2=preferences.
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean("checkbackground", true);
editor.commit();
}
}
return 1;
}
public void onStart(Intent intent, int startId) {
}
public IBinder onUnBind(Intent arg0) {
return null;
}
public void onStop() {
this.stopSelf();
}
public void onPause() {
}
@Override
public void onDestroy() {
super.onDestroy();
Log.e("Destroy=======@@@@@@@","method calling");
dob.cancel(false);
while(strtId>0){
this.stopSelf(strtId);
strtId--;
}
onStop();
}
@Override
public void onLowMemory() {
}
}
这是asynctask类
class Doinback extends AsyncTask<URL, Integer, Long>{
protected void onPreExecute()
{
}
protected Long doInBackground(URL... arg0) {
if(!isCancelled())
{
try {
strResLastmessage_time = UrltoValue.getValuefromUrl(DataUrls.lastmessage_time + "userid="+strUserId);
JSONObject jsonObj = new JSONObject(strResLastmessage_time);
strLastMessage_time = jsonObj.getString("lastdatetime");
preferences = PreferenceManager.getDefaultSharedPreferences(BackgroundService.this);
SharedPreferences.Editor editor = preferences.edit();
editor.putLong("msgtime", Long.parseLong(strLastMessage_time));
editor.commit();
} catch (Exception e) {
// e.printStackTrace();
}
messages.clear();
readSmsFromDevice();
checkMessages();
}
return null;
}
protected void onCancelled() {
}
protected void onPostExecute(Long result) {
//check=preferences.getBoolean("checkbackup", true);
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean("checkbackup", true);
editor.putBoolean("checkbackground", true);
editor.commit();
}
}//async class
在这个asyntask类中我使用readsmsfromdevice方法和checkmessages方法从设备获取数据并发布到服务。但我的要求是每当用户想要注销时,服务必须停止。所以我使用的是以下代码停止服务并停止asynctask。
BackgroundService.dob.cancel(true);
getActivity().stopService(new Intent(getActivity(), BackgroundService.class));
但它不起作用,仍然在后台继续进行。请建议我如何停止此服务。谢谢提前......
答案 0 :(得分:0)
您正在调用正确的方法&#34; this.stopSelf()&#34;。我曾经有过这个问题,并在添加返回Service.START_NOT_STICKY之后就可以了。您可以在onStartCommand方法上添加此代码并检查它是否有效:
return Service.START_NOT_STICKY;
答案 1 :(得分:0)
您需要的是IntentService。From docs:
IntentService是处理异步的Services的基类 请求(表示为Intents)。客户端发送请求 通过startService(Intent)调用;该服务根据需要启动, 使用工作线程依次处理每个Intent,并自行停止 当它用完了。
请参阅此链接,了解如何使用IntentService:
http://code.tutsplus.com/tutorials/android-fundamentals-intentservice-basics--mobile-6183