Pregunta

When i remove my app from task manager.0 process and 1 service left. App do crash again and again what should i do to resolve it? This is my service class. I want to ask one more thing the difference between OnStart() method and OnStartCommand() method?

package com.example.vaccinationsystem;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;

import android.annotation.SuppressLint;
import android.app.AlarmManager;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.SystemClock;
import android.util.Log;
import android.widget.TabHost.OnTabChangeListener;

@SuppressLint("Override")
public class BackgroundServices extends Service {

String userId;
SoapObject request;
PropertyInfo p_userId;
SoapSerializationEnvelope envelope;
HttpTransportSE httpTransport;
SoapPrimitive response;
ArrayList<String> listRec;
String s;
int totalDifference;
int countNotification = 0;

private static final String METHOD_NAME = "Alerts";
private static final String NAMESPACE = "http://org.fyp.ws";
private static final String SOAP_ACTION = "http://org.fyp.ws/Alerts";
private static final String URL = StaticIP.ipAddress
        + "GeneralUserServices?wsdl";

@Override
public IBinder onBind(Intent arg0) {
    return null;
}

// @Override
// public void onCreate() {
//
// Toast.makeText(this, "Congrats! MyService Created",
// Toast.LENGTH_LONG).show();
// // Log.d(TAG, "onCreate");
// }

@Override
public void onStart(Intent intent, int startId) {


    userId = intent.getExtras().getString("user_Id");
    listRec = new ArrayList<String>();
    request = new SoapObject(NAMESPACE, METHOD_NAME);
    p_userId = new PropertyInfo();
    envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    httpTransport = new HttpTransportSE(URL);

    p_userId.setName("userId");// Define the variable name in the web
    p_userId.setValue(userId);// Define value for fname variable
    p_userId.setType(String.class);// Define the type of the variable
    request.addProperty(p_userId);// Pass properties to the variable

    envelope.setOutputSoapObject(request);


    try {

        httpTransport.call(SOAP_ACTION, envelope);
        response = (SoapPrimitive) envelope.getResponse();
        // Toast.makeText(getApplicationContext(), response.toString(),
        // Toast.LENGTH_LONG).show();

        String[] row = response.toString().split("`");

        for (int i = 0; i < row.length; i++) {

            String[] record = row[i].split("~");
            // totalDifference = 0;
            Calendar c = Calendar.getInstance();
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");

            String curDate = df.format(c.getTime()).toString();
            String visitDate = record[1];

            java.util.Date cD = df.parse(curDate);
            java.util.Date vD = df.parse(visitDate);

            Calendar cCurDate = Calendar.getInstance();
            cCurDate.setTime(cD);
            cCurDate.add(Calendar.DAY_OF_YEAR, 0);
            java.util.Date newCurDate = cCurDate.getTime();

            Calendar cNotificationStartVisitDate = Calendar.getInstance();
            cNotificationStartVisitDate.setTime(vD);
            cNotificationStartVisitDate.add(Calendar.DAY_OF_YEAR, -15);
            java.util.Date notificationStartDate = cNotificationStartVisitDate
                    .getTime();

            Calendar cOrignalVisitDate = Calendar.getInstance();
            cOrignalVisitDate.setTime(vD);
            cOrignalVisitDate.add(Calendar.DAY_OF_YEAR, 0);
            java.util.Date newOriDateVisitDate = cOrignalVisitDate
                    .getTime();
            totalDifference = 0;

            if (notificationStartDate.before(newCurDate)) {

                while (newOriDateVisitDate.after(newCurDate)) {
                    cOrignalVisitDate.add(Calendar.DAY_OF_YEAR, -1);
                    newOriDateVisitDate = cOrignalVisitDate.getTime();
                    totalDifference++;
                    s = "left";
                }
                while (newOriDateVisitDate.before(newCurDate)) {
                    cOrignalVisitDate.add(Calendar.DAY_OF_YEAR, +1);
                    newOriDateVisitDate = cOrignalVisitDate.getTime();
                    totalDifference++;
                    s = "ago";
                }
                countNotification++;
                listRec.add(record[2] + " Vaccine due: " + String.valueOf(totalDifference)
                        + " days " + s);

            }

        }

        for (int j = 0; j < countNotification; j++) {

            NotificationManager nm = (NotificationManager) getApplicationContext()
                    .getSystemService(getApplicationContext().NOTIFICATION_SERVICE);
            Notification note = new Notification(R.drawable.nav_down,
                    "Vaccination ALerts!", System.currentTimeMillis());
            Intent inNotification = new Intent(this,GenUserFunction.class);
            inNotification.putExtra("user_id", userId);
            PendingIntent i =  PendingIntent.getActivity(getBaseContext(), 0,inNotification, 0);
            note.setLatestEventInfo(getApplicationContext(), "Vaccine       Due",
                    listRec.get(j), i);
            nm.notify(j, note);


        }



        // Toast.makeText(getApplicationContext(),
        // String.valueOf(listRec.size()), Toast.LENGTH_SHORT).show();

    } catch (Exception e) {
        // TODO: handle exception
        System.out.println(e.getMessage());

    }




    // Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();

    // Note: You can start a new thread and use it for long background
    // processing from here.
}





@Override
public void onDestroy() {


enter code here
    super.onDestroy();

    // Toast.makeText(this, "MyService Stopped", Toast.LENGTH_LONG).show();
    // Log.d(TAG, "onDestroy");
}
   }
¿Fue útil?

Solución

  1. void onStart(Intent intent, int startId) is deprecated, you need to use int onStartCommand(Intent intent, int flags, int startId) instead.
  2. onStart(...) is called from the onStartCommand(...) for backwards compatibility, and default implementation of the onStartCommand(...) returns the START_STICKY value. So, after the killing, yours service will be restarted by the system. When the service is restarted by the system, onStart(...) method can be called with a null intent object, and intent.getExtras().getString("user_Id") throws the NullPointerException, and service will be crashed, and restarted by the system...

As conclusion: you need to check the intent object for null befor using it.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top