簡體   English   中英

即使調用stopService,服務仍繼續運行

[英]Service continues running even after calling stopService

我有一項服務,每15分鍾檢查一次Web API的某些信息,並且會彈出一個通知。現在,當我單擊按鈕注銷時,我正在執行stopService來停止正在運行的服務。 我在設置中正在運行的應用程序上沒有看到它,並且我認為它當前未運行。 但是我仍然每15分鍾收到一次通知。 這是我的服務。

@Override
public void onCreate() {
    // TODO Auto-generated method stub
    super.onCreate();
    intent = new Intent(BROADCAST_ACTION);
    i1 = new Intent(this, BGService.class);
    Notification note = new Notification( 0, null, System.currentTimeMillis() );
    note.flags |= Notification.FLAG_NO_CLEAR;

    startForeground(1337, note);
    handler = new Handler();

    preferences = getSharedPreferences(pref_data, Context.MODE_PRIVATE);
    driverPassword = preferences.getString("driverPassword","");
    carrierId = preferences.getString("carrierId","");
    cctid = preferences.getString("CCTID","");
    shipment = preferences.getString("shipment","");

    try
    {
        JSONObject shipmentObject = new JSONObject(shipment);
        shipmentID = shipmentObject.getString("ShipmentId");
    }
    catch(Exception e)
    {

    }

     powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
     wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                "MyWakeLock");


     handler.removeCallbacks(sendWakeLock);
     handler.postDelayed(sendWakeLock, 60000); // 1 second   

}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

     return  Service.START_NOT_STICKY;
}

 private Runnable sendWakeLock = new Runnable() {
        public void run() {     
            wakeLock.acquire();
            checkShipments();
            handler.postDelayed(this, 900000);
        }
    };

private void checkShipments()
{
    shipment = preferences.getString("shipment","");

    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

    StrictMode.setThreadPolicy(policy); 
    String authData = "Basic " + Base64.encodeToString((cctid+ ":" + driverPassword).getBytes(), Base64.NO_WRAP);
    String URL = "http://dev.landstarcapacityplus.com/MobileServices/api/Shipments?CCTID=" + cctid;
    authData = "Basic " + Base64.encodeToString((cctid + ":" + driverPassword).getBytes(), Base64.NO_WRAP);
    DefaultHttpClient httpclient = new DefaultHttpClient();
    HttpGet httpget = new HttpGet(URL);
    httpget.setHeader("Authorization", authData);
    HttpResponse response = null;
    try {
        response = httpclient.execute(httpget);
        StatusLine sl2 = response.getStatusLine();
            int statCode2 = sl2.getStatusCode();
            entityShipment = EntityUtils.toString(response.getEntity());
            JSONObject shipments = new JSONObject(entityShipment);
            Log.i("Tag", "Checked API for shipments");
            Log.i("Status Code", String.valueOf(statCode2));
            if (statCode2 == 200) {
                try {
                    if(!entityShipment.equals(null) && !entityShipment.equals("") && !entityShipment.equals("[]") && !shipments.getString("ShipmentId").equals("0"))
                    {
                        if(shipment.equals(""))
                        {
                            Log.i("New Shipment", String.valueOf(statCode2));
                            if(preferences.getString("isBackground","").equals("True") && !preferences.getString("isAccepted","").equals("True"))
                                sendNotificationToDevice("You have a new shipment");

                            SharedPreferences.Editor editor = preferences.edit();
                            editor.putString("isDriverLogin", "True");
                            editor.putString("driverPassword", driverPassword);
                            editor.putString("carrierId", carrierId);
                            editor.putString("CCTID", cctid);
                            editor.putString("shipment", entityShipment);
                            editor.putString("isAccepted", "");
                            editor.putString("newshipment", "");
                            editor.putString("shipmentStatus", "");
                            editor.putString("lastGpsUpdate", "");
                            editor.commit();
                            sendBroadcast("new", entityShipment);
                        }
                        else
                        {

                            Log.i("Reassigned Shipment", String.valueOf(statCode2));
                            JSONObject storedShipment = new JSONObject(shipment);

                            if(!shipments.getString("ShipmentId").equals(storedShipment.getString("ShipmentId")))
                            {
                                if(preferences.getString("isBackground","").equals("True"))
                                {
                                    if(preferences.getString("isAccepted","").equals("True"))
                                        sendNotificationToDevice("GPS has been disabled. You have been assigned to a new shipment");
                                    else
                                        sendNotificationToDevice("You have been assigned to a new shipment");
                                }

                                SharedPreferences.Editor editor = preferences.edit();
                                editor.putString("isDriverLogin", "True");
                                editor.putString("driverPassword", driverPassword);
                                editor.putString("carrierId", carrierId);
                                editor.putString("CCTID", cctid);
                                editor.putString("shipment", shipment);
                                editor.putString("newshipment", entityShipment);
                                editor.putString("shipmentStatus", "");
                                editor.putString("lastGpsUpdate", "");
                                editor.commit();
                                stopService(i1);
                                sendBroadcast("new", entityShipment);

                            }
                            else
                            {
                                if(!preferences.getString("isAccepted","").equals("True"))
                                {
                                    if(preferences.getString("isBackground","").equals("True"))
                                    {
                                        sendNotificationToDevice("You have a new shipment");
                                    }
                                }
                                SharedPreferences.Editor editor = preferences.edit();
                                editor.putString("shipment", entityShipment);
                                editor.commit();
                            }


                        }
                    }
                    else
                    {
                        if(!shipment.equals(""))
                        {
                            Log.i("Removed shipment", String.valueOf(statCode2));
                            if(preferences.getString("isBackground","").equals("True"))
                                sendNotificationToDevice("Your shipment has been removed");

                            SharedPreferences.Editor editor = preferences.edit();
                            editor.putString("isDriverLogin", "True");
                            editor.putString("driverPassword", driverPassword);
                            editor.putString("carrierId", carrierId);
                            editor.putString("CCTID", cctid);
                            editor.putString("shipment", "");
                            editor.putString("isAccepted", "");
                            editor.putString("newshipment", "");
                            editor.putString("isRemoved", "True");
                            editor.putString("shipmentStatus", "");
                            editor.putString("lastGpsUpdate", "");
                            editor.commit();
                            stopService(i1);
                            sendBroadcast("removed", entityShipment);
                        }
                    }
                } 
                catch (Exception e) {
                }
            }
            else
            {
            }
    }
    catch (Exception e)
    {
    }
}

@SuppressWarnings("deprecation")
 private void sendNotificationToDevice(String message)
 {
        NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        int icon = R.drawable.ic_launcher;
        CharSequence tickerText = message;
        long when = System.currentTimeMillis();

        Notification notification = new Notification(icon, tickerText, when);
        Context context = getApplicationContext();
        CharSequence contentTitle = "Landstar";
        CharSequence contentText = message;
        Intent intent;
        if(preferences.getString("isBackground","").equals("True"))
            intent= new Intent(context, StartActivity.class);
        else
            intent= new Intent(context, LandstarPage.class);

        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);

        PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        //PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent,  PendingIntent.FLAG_UPDATE_CURRENT | Notification.FLAG_AUTO_CANCEL);
        notification.defaults |= Notification.DEFAULT_SOUND;
        notification.defaults |= Notification.DEFAULT_VIBRATE;

        notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);

        notification.flags |= Notification.FLAG_AUTO_CANCEL;

        mNotificationManager.notify(1111, notification);
 }

private void sendBroadcast(String status, String shipment)
{
    intent.putExtra("status", status);
    intent.putExtra("shipment", shipment);
    sendBroadcast(intent);
}

@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}

這是我停止的方法。

stopService(i1);

這是意圖。 您可能會尋找它。

i1 = new Intent(this, BGService.class);

我提供了我所有的方法和所有隱藏的方法,以供大家參考。 你們對什么原因有任何想法嗎? 謝謝!

問題:

I'm not seeing it on my running applications on my settings and I believe it is not currently running

解:

是的,您的Service已停止,但Thread仍在運行。

只需重寫您的ServiceonDestroy()方法,如下所述:

    @Override
public void onDestroy() {
    super.onDestroy();
     handler.removeCallbacks(sendWakeLock);

}

我希望這會有所幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM