2014-10-10 171 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

相关问题