2014-05-14 2 views
1

내가 작업 관리자 0 프로세스에서 앱을 삭제하고 1 개의 서비스가 남아 있습니다. 앱이 계속해서 충돌을 일으켜 문제를 해결해야합니까? 이것은 내 서비스 클래스입니다. OnStart() 메서드와 OnStartCommand() 메서드의 차이점을 한 가지 더 묻고 싶습니다.Android 백그라운드 서비스가 중단되는 동안 오류가 발생합니다.

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"); 
} 
    } 
+0

오류를 해결하려면 오류를 현지화하고 수정해야합니다. –

+0

서비스 코드를 게시 할 수 있습니까? –

답변

1
  1. void onStart(Intent intent, int startId)는 대신 int onStartCommand(Intent intent, int flags, int startId)를 사용해야되지 않습니다.
  2. 은 하위 호환성을 위해 onStartCommand(...)에서 호출되며 onStartCommand(...)의 기본 구현은 START_STICKY 값을 반환합니다. 그래서, 살해 후에, 당신의 서비스는 시스템에 의해 재시작 될 것입니다. 서비스가 시스템에 의해 다시 시작하면 onStart(...) 방법은 결론적으로

... 널 의도 객체로 호출하고, intent.getExtras().getString("user_Id")NullPointerException를 던져 및 서비스가 충돌되고, 시스템이 다시 시작할 수 있습니다 : 당신은 그것을 사용하여 null에 대한 intent 개체를 확인해야합니다.

관련 문제