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");
}
}
void onStart(Intent intent, int startId)
is deprecated, you need to useint onStartCommand(Intent intent, int flags, int startId)
instead.onStart(...)
is called from theonStartCommand(...)
for backwards compatibility, and default implementation of theonStartCommand(...)
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, andintent.getExtras().getString("user_Id")
throws theNullPointerException
, and service will be crashed, and restarted by the system...As conclusion: you need to check the
intent
object fornull
befor using it.