2012-10-17 76 views
1

即时通讯尝试从活动启动服务,但是当按钮点击它时,模拟程序会停止我的应用程序并告诉我:“应用程序(...)意外停止,请重试”应用程序在服务启动时崩溃

在我的表现,我有

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

我用它来调用(从TimerGuardActivity)服务代码:

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); 
}} 

编辑:

请帮我在这里停留的IM将近一个月

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

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

+0

TimerGuardActivity的第39行是什么? (或者甚至更好地发布整个代码)。这是空指针明显来自哪里。 – Teovald

+0

可以请你在你的logcat上显示你的TimerGuardActivity和错误,它会帮助我们解决问题。 –

回答

0

好吧在这里去我的回答:

我是一个Eclipse/Android用户,希望这个简单的调试过程将帮助你在这里。 您可以在Eclipse中设置断点,方法是在要断开的行旁边单击鼠标右键,然后选择“切换断点”。从那里你要选择“调试”而不是标准的“运行”,这将允许你一步一步等等。使用LogCat提供的过滤器(在您的教程中引用),以便您可以定位所需的消息,而不是涉及所有输出。这将会(希望)帮助你理解你的错误很长的路要走。

此外,你需要看看你的logcat。复制日志并将其保存在文本编辑器中。它说什么 ?一般查看异常一词或一个调用堆栈或任何对应用程序的引用。这可能有帮助。

+0

但是我没有回答,请帮助,如果你看到。 – user1753261

+0

我可以请你帮忙吗? – user1753261

0

您的stopService(i)方法会导致应用程序崩溃。