2014-10-10 156 views
0

我需要監聽screen_on和screenof_action。來自BroadcastReceiver的Android調用服務

我使用BroadcastReceiver和Service。但我得到錯誤。我如何修復我的代碼?

這是我的廣播接收器類:

public class BroadcastReceiver extends android.content.BroadcastReceiver { 
    public static boolean screenOff = true; 
    @Override 
    public void onReceive(Context context, Intent intent) { 
    if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
     screenOff = true; 
     // System.out.println("System ON OLDU ON ON ON ON ON ON"); 
     Intent i = new Intent(context, MyNewService.class); 
     i.putExtra("screen_state", true); 
     context.startService(i); 
    } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
     screenOff = false; 
     Intent i = new Intent(context, MyNewService.class); 
     i.putExtra("screen_state", false); 
     context.startService(i); 
     // System.out.println("System OFFFF OLDU OFFFF OFFFF OFFFF OFFFF"); 
    } 
} 
} 

這是我的服務類:

public class MyNewService extends Service { 
    BroadcastReceiver locker; 
    public static boolean screenOn = true; 

    public void onCreate(){ 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction(Intent.ACTION_SCREEN_ON); 
     filter.addAction(Intent.ACTION_SCREEN_OFF); 
     locker=new BroadcastReceiver(); 
     registerReceiver(locker, filter); 
    } 

    @Override 
    public void onStart(Intent intent, int startId) { 
     Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show(); 
     Log.i("START", "onStart"); 
     screenOn = intent.getBooleanExtra("screen_state", false); 
     if(screenOn){ 
      // startActivity(new Intent(this, MainActivity.class)); 
      Log.i("SCREEN", "SCREEN OFFFFFFFFFFFFFFFF"); 
     } else { 
      Log.i("SCREEN", "SCREEN OF FFFFFFFFFFFFFFFFFFFFFFFFF"); 
     } 
    // If the screen is off then the device has been locked 
    } 

    @Override 
    public void onDestroy(){ 
     unregisterReceiver(locker); 
    } 

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

這是我的錯誤代碼:

:19:52.696 32141-32141/? E/AndroidRuntime﹕ FATAL EXCEPTION: main 
     Process: com.codeexamples.app, PID: 32141 
     java.lang.RuntimeException: Unable to start service [email protected] with Intent { cmp=com.codeexamples.app/.MyNewService }: java.lang.NullPointerException 
      at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2705) 
      at android.app.ActivityThread.access$2100(ActivityThread.java:135) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1293) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:136) 
      at android.app.ActivityThread.main(ActivityThread.java:5001) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
      at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.NullPointerException 

    at com.codeexamples.app.MyNewService.onStart(MyNewService.java:25) 
       at android.app.Service.onStartCommand(Service.java:450) 
       at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2688) 
       at android.app.ActivityThread.access$2100(ActivityThread.java:135) 
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1293) 
       at android.os.Handler.dispatchMessage(Handler.java:102) 
       at android.os.Looper.loop(Looper.java:136) 
       at android.app.ActivityThread.main(ActivityThread.java:5001) 
       at java.lang.reflect.Method.invokeNative(Native Method) 

這是我的清單在未經許可:

服務:

<service 
     android:name="com.codeexamples.app.MyNewService" 
     android:enabled="true" /> 

廣播:

<receiver android:name="com.codeexamples.app.BroadcastReceiver" > 
    </receiver> 

許可:

<uses-permission android:name="android.permission.DISABLE_KEYGUARD" /> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
<uses-permission android:name="android.permission.BROADCAST_STICKY"/> 

當我M在檢查錯誤logcat顯示我這一行:

screenOn = intent.getBooleanExtra(「screen_state」,false);

總是顯示這一行,我認爲在這一行中有錯誤。

+0

你有java.lang.NullPointerException,發佈整個堆棧跟蹤 – pskink 2014-10-10 06:42:36

+0

我想你想要所有的錯誤,我加了我的代碼 – 2014-10-10 06:45:29

+0

java.lang.NullPointerException來自com.codeexamples.app.MyNewService.onStart(MyNewService.java:25) – pskink 2014-10-10 06:49:30

回答

0

Android可能會毫無目的地調用您的onStart()方法。您可以在Service Javadocs中閱讀有關此行爲的更多信息。

最好的辦法是同時重寫onStart()onStartCommand()方法(因爲API 5.0版本以前已被棄用)如JavaDoc中所述,確保你滿足其中的意圖是null的情況。

+0

如何在我的服務上使用onStartCommand?我改變onStart onStartCommand和@覆蓋線獲取錯誤。所以我刪除@覆蓋線並部署到我的模擬器,但服務沒有啓動。當我使用onStartCommand時沒有發生任何事情 – 2014-10-10 07:04:11

0

我試過你的代碼,找到你的問題的解決方案。

1.去除下面的代碼從您的manifest.xml

<receiver android:name="com.codeexamples.app.BroadcastReceiver" > 
    </receiver> 

既然您註冊BroacastReceiver在你的代碼,你不應該在你的menifest.xml註冊。我試圖在清單中註冊而不是代碼,但它不能工作,不知道爲什麼。

2.啓動您服務您的活動最初註冊您的廣播接收器,代碼如下:

private void startMyService() { 
    Intent intent = new Intent(this, MyNewService.class); 
    startService(intent); 
} 

或者您也可以將您的代碼註冊您的廣播接收器到你的活動,因此你不需要最初開始你的服務。

3。更改您在onStart()方法來onStartCommand()方法,因爲這:

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 

    // Here paste your code in your onStart() method. 

    return START_STICKY; 
} 

更新:

聲明本文檔(http://developer.android.com/reference/android/app/Service.html#START_STICKY)中:

不斷從onStartCommand(意向返回, int,int):如果此服務的進程在啓動時(從onStartCommand(Intent,int,int)返回後終止),則將其保留在啓動狀態,但不保留此已傳遞的意圖。稍後系統將嘗試重新創建該服務。因爲它處於啓動狀態,它將保證在創建新的服務實例後調用onStartCommand(Intent,int,int); 如果沒有任何未完成的啓動命令要發送到服務,它將被調用一個空意圖對象,因此您必須注意檢查此

所以,如果你在你的代碼中沒有做錯什麼,你應該自己檢查空意圖。

+0

我做了但仍然出現錯誤。同一條線。我改變了幾乎所有的東西,但所有的時間顯示這一行:screenOn = intent.getBooleanExtra(「screen_state」,false);我真的嘗試過這個錯誤 – 2014-10-10 07:17:58

+0

我做了你悲傷的一切,但仍然在同一行發生錯誤布爾screenOn = intent.getBooleanExtra(「screen_state」,false); – 2014-10-10 08:06:16

+0

@SibelTahta查看我的更新。順便說一句,我的操作系統版本是4.4,我沒有看到這個錯誤。 – 2014-10-10 08:19:36

1

感謝所有,最後我找到了解決辦法

這一行:

boolean screenOn = intent.getBooleanExtra("screen_state", false); 

必須在try/catch語句的工作,最後我做到這個樣子,和它的完全工作

try { 
    boolean screenOn = intent.getBooleanExtra("screen_state", false); 
} catch 
(Exception e) {} 
+0

你知道,爲什麼它總是拋出異常? – 2015-10-13 06:25:37

相關問題