2012-10-17 6 views
1

활동에서 서비스를 시작하려고 시도했지만 단추를 클릭하여 호출하면 시뮬레이터가 내 응용 프로그램을 중지하고 "응용 프로그램 (...)이 예기치 않게 중지되었습니다. 다시 시도하십시오." 내 매니페스트에서서비스 시작시 응용 프로그램이 작동을 멈 춥니 다.

내가 있습니다

<service android:name=".MainService" android:enabled="true" android:label="Main Service"></service>

내가 (TimerGuardActivity)에서 서비스를 호출하는 데 사용하는 코드 :

,691을

Intent i = new Intent(TimerGuardActivity.this, MainService.class); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); TimerGuardActivity.this.startService(i);

전체 서비스 자체 :

package com.AirplaneModeGuard; 

import java.util.Calendar; 

import android.app.Service; 

import android.content.Intent; 

import android.content.SharedPreferences; 

import android.os.IBinder; 

import android.preference.PreferenceManager; 

import android.provider.Settings; 

public class MainService extends Service { 

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

} 

@Override 
public void onCreate() { 
    // TODO Auto-generated method stub 
    super.onCreate(); 
} 

@Override 
public void onDestroy() { 
    // TODO Auto-generated method stub 
    super.onDestroy(); 
} 

@Override 
public void onStart(Intent intent, int startId) { 
    // TODO Auto-generated method stub 
    super.onStart(intent, startId); 

    SharedPreferences preferences =  PreferenceManager.getDefaultSharedPreferences(getApplicationContext());  
    boolean guardE = preferences.getBoolean("guardenabled", false); 
    boolean nightE = preferences.getBoolean("nightsleepenabled", false); 

    if(guardE&&!nightE) 
    { 
     guard(false,-1);    
    } 
    if(guardE&&nightE) 
    { 
     guard(true,checkTimeForGuard()); 
    } 
    if(nightE&&!guardE) 
    { 
     nightSleep(false); 
    } 
    if(!guardE&&!nightE) 
    { 
     Intent i=new Intent(this,MainService.class); 
     stopService(i); 
    } 



} 

private void guard(final boolean nightsleeptoggled, final int timeToRun) 
{ 
    if(nightsleeptoggled&&timeToRun==-1){ 
     nightSleep(true); 
     return; 
    } 
    new Thread(new Runnable(){ 
      int minutesCount=0; 
      SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
      int minNum = preferences.getInt("checkeveryM", 10) ;//shared preferences 

      public void run() { 

       if(nightsleeptoggled) 
       { 
      while(true) 
      { 
       try { 
       Thread.sleep(60000); // one minute (1000= 1sec) 
       minutesCount++; 

       if(minutesCount>= timeToRun) 
        break; 
       if(minutesCount % minNum==0) 
       { 

       ToggleAirplaneMode(false); 
        Thread.sleep(60000); 
       ToggleAirplaneMode(true); 

       } 
        } 
       catch (InterruptedException e) 
       { 
       e.printStackTrace(); 
       } 
      } 
      nightSleep(true); 
       } 

       else 
       { 
        minNum*=6000; 
        while(true) 
        { 
         try 
         { 
         Thread.sleep(minNum); // one minute 
         ToggleAirplaneMode(false); 
          Thread.sleep(60000); 
         ToggleAirplaneMode(true);       
         } 
         catch (InterruptedException e) 
         { 
         e.printStackTrace(); 
         } 
        }      
       } 

      } 
      }).start(); 
    return; 

} 

private void nightSleep(boolean guardE) 
{ 

    int TimeToSleep = checkTimeToSleep(); 
    if(TimeToSleep<0) 
    { 
     guard(true,checkTimeForGuard()); 
     return; 
    } 
    try{ 
     ToggleAirplaneMode(false); 
     Thread.sleep(TimeToSleep*1000); 
     ToggleAirplaneMode(true); 

     if(guardE) 
     { 
      guard(true, checkTimeForGuard()); 
     } 
     return; 
    } 
    catch (InterruptedException e) 
    { 
    e.printStackTrace(); 
    } 

} 

private int checkTimeToSleep()//take values of sleeptime and wakeuptime from shared preferences and calculate the total amount of minutes to sleep 
    //if the current hour is after the sleeptime use it as the sleeptime. 
{ 
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
    int sleepM = preferences.getInt("SleepM", 0); 
    int sleepH = preferences.getInt("SleepH", 0); 
    int wakeupM = preferences.getInt("WakeUpM", 0); 
    int wakeupH = preferences.getInt("WakeUpH", 0); 
    int finalTime=0; 
    Calendar c = Calendar.getInstance(); 
    int minutes = c.get(Calendar.MINUTE); 
    int hours = c.get(Calendar.HOUR_OF_DAY); 

    if(sleepH==wakeupH) 
    { 
     if(sleepM>wakeupM) 
      finalTime =wakeupM-sleepM; 
     else 
      finalTime=1440-(wakeupM-sleepM); 
    } 

    if(sleepH>wakeupH) 
    { 
     if(hours<wakeupH || hours>sleepH) 
     { 
      if(hours<24 && hours>sleepH){ 
       sleepH=hours; 
       sleepM=minutes; 
      } 
      else{ 
       sleepH= hours+24; 
       sleepM=minutes; 
       } 
     } 
     if(hours==sleepH && minutes>sleepM) 
      sleepM=minutes; 
     if(hours==wakeupH && minutes<wakeupM) 
     { 
      wakeupM=minutes; 
      sleepH=hours+24; 
     } 
     finalTime = 60*(24-sleepH+wakeupH); 
     finalTime+=(wakeupM-sleepM); 
    } 

    else if(sleepH<wakeupH) 
    { 
     if(hours>=wakeupH && hours<=sleepH) 
     { 
      sleepH=hours; 
      sleepM=minutes; 
     } 
     finalTime = 60*(sleepH-wakeupH); 
     finalTime+=(wakeupM-sleepM); 
    } 

    return finalTime; 
} 

private int checkTimeForGuard() //checks the amount of minutes guard should run in case nightsleep is enabled 
{ 
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
    Calendar c = Calendar.getInstance(); 
    int minutes = c.get(Calendar.MINUTE); 
    int hours = c.get(Calendar.HOUR_OF_DAY); 
    int sleepM = preferences.getInt("SleepM", 0); 
    int sleepH = preferences.getInt("SleepH", 0); 
    int wakeupM = preferences.getInt("WakeUpM", 0); 
    int wakeupH = preferences.getInt("WakeUpH", 0); 

    int value=0; 



    if(sleepH>wakeupH) 
    { 
     if(hours<wakeupH || hours>sleepH) 
      return -1; 
     if(hours==sleepH && minutes>sleepM) 
      return -1; 
     if(hours==wakeupH && minutes<wakeupM) 
      return -1; 
     value = 1440-checkTimeToSleep(); 
     value-=((60*(hours-wakeupH))+(minutes-wakeupM)); 
    } 

    else if(sleepH<wakeupH) 
    { 
     if(hours>wakeupH && hours<sleepH) 
      return -1; 
     if(hours==sleepH && minutes>sleepM) 
      return -1; 
     if(hours==wakeupH && minutes<wakeupM) 
      return -1; 

     if(hours>=sleepH) 
     { 
      value=60*(sleepH-hours); 
      value+=(sleepM-minutes); 
     } 
     if(hours<=wakeupH) 
     { 
      value=60*(24+sleepH-hours); 
      value+=(sleepM-minutes); 
     } 
    } 

    return value; 
} 

private void ToggleAirplaneMode(boolean isEnabled)//turn off airplanemode (radiation on)=true, on=false 
{ 
    Settings.System.putInt(
      getApplicationContext().getContentResolver(), 
       Settings.System.AIRPLANE_MODE_ON, isEnabled ? 0 : 1); 
}} 

편집 :

나 메신저 거의 한 달 동안 여기 붙어 도와주세요

http://imageshack.us/photo/my-images/89/error1poh.png/

http://imageshack.us/photo/my-images/405/errorlog.png/

+0

TimerGuardActivity의 39 번째 줄에는 무엇이 있습니까? (또는 전체 코드를 게시하는 것이 더 좋습니다). 이것은 널 포인터가 명백하게 나오는 곳입니다. – Teovald

+0

TimerGuardActivity를 표시하고 문제가있는 곳의 logcat에 오류가 있으면 알려주십시오. –

답변

0

여기 내 대답은 다음과 같습니다.

저는 Eclipse/Android 사용자입니다.이 간단한 디버깅 프로세스가 도움이되기를 바랍니다. 중단하려는 줄 옆을 마우스 오른쪽 단추로 클릭하고 "중단 점 토글"을 선택하여 Eclipse에서 중단 점을 설정합니다. 거기에서 "실행"대신 "디버그"를 선택하여 단계별로 수행 할 수 있습니다. LogCat에서 제공하는 필터 (자습서 참조)를 사용하면 모든 출력을 처리하는 대신 원하는 메시지를 대상으로 지정할 수 있습니다. 그것은 (잘하면) 오류의 의미를 이해하는데 도움이 될 것입니다.

또한 logcat을 살펴 봐야합니다. 로그를 복사하여 텍스트 편집기에 보관하십시오. 그것은 무엇을 말하는가 ? 일반적으로 예외 또는 콜 스택 또는 응용 프로그램에 대한 참조를 찾습니다. 그게 도움이 될거야.

+0

아직 답이 없습니다. 그 점을 보시면 도움주세요. – user1753261

+0

도움을받을 수 있습니까? – user1753261

0

stopService (i) 메소드가 앱을 크래시합니다.

관련 문제