【问题标题】:Android Calling Service from BroadcastReceiver来自 BroadcastReceiver 的 Android 呼叫服务
【发布时间】:2014-10-10 06:37:18
【问题描述】:

我需要听 screen_on 和 screenof_action。

我将 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  com.codeexamples.app.MyNewService@42672530 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"/>

当我在 logcat 中检查错误时,会显示这一行:

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

总是显示这一行,我认为这行有问题。

【问题讨论】:

  • 你有 java.lang.NullPointerException,发布整个堆栈跟踪
  • 我认为你想要所有错误,我添加了我的代码
  • java.lang.NullPointerException 来自 com.codeexamples.app.MyNewService.onStart(MyNewService.java:25)
  • 我知道并且我在主题的末尾添加了这一行。请检查。
  • 所以intent 为空,请阅读onStartCommand,因为onStart 已弃用

标签: android service broadcast


【解决方案1】:

谢谢大家,终于我找到了解决办法

这一行:

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

必须在try/catch中工作,最后我做到了,它的工作完全

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

【讨论】:

  • 你知道为什么它总是抛出那个异常吗?
【解决方案2】:

Android 可能会无意识地调用您的 onStart() 方法。您可以在Service Javadocs 中阅读有关此行为的更多信息。

如 Javadocs 中所述,最好的方法是覆盖 onStart()onStartCommand() 方法(前者自 API 版本 5 以来已被弃用),确保满足意图为 @987654325 的情况@。

【讨论】:

  • 如何在我的服务上使用 onStartCommand?我将 onStart 更改为 onStartCommand 并且 @Override 行出现错误。所以我删除了@Override 行并部署到我的模拟器,但服务没有启动。当我使用 onStartCommand 时没有发生任何事情
【解决方案3】:

我尝试了你的代码并为你的问题找到了解决方案。

1.从您的 manifest.xml 中删除以下代码

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

由于您在代码中注册了 BroacastReceiver,因此您不应在 menifest.xml 中注册它。我已经尝试在清单中注册它而不是在代码中注册它,但是它不能工作,不知道为什么。

2.首先在你的Activity中启动你的Service来注册你的BroadcastReceiver,代码如下:

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

或者您可以将用于注册 BroadcastReceiver 的代码移动到您的 Activity 中,因此您不需要一开始就启动您的服务。

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(Intent, int, int) 返回的常量:如果该服务的进程在启动时被杀死(在从 onStartCommand(Intent, int, int) 返回之后),则将其保持在启动状态但不要' t 保留此传递的意图。稍后系统将尝试重新创建服务。因为处于启动状态,所以会保证在创建新的服务实例后调用onStartCommand(Intent, int, int); 如果没有任何待处理的启动命令要传递给服务,则会使用 null 意图对象调用它,因此您必须注意检查这一点

因此,如果您在代码中没有做错任何事情,您应该自己检查 null 意图。

【讨论】:

  • 我做了,但仍然出现错误。同一行。我几乎改变了一切,但一直显示这一行:screenOn = intent.getBooleanExtra("screen_state", false);我真的尝试过这个错误
  • 我做了所有你伤心的事,但在同一行中仍然出现错误 boolean screenOn = intent.getBooleanExtra("screen_state", false);
  • @SibelTahta 查看我的更新。顺便说一句,我的操作系统版本是 4.4,我没有看到那个错误。
  • 终于我发现了我的错误和它现在的工作!检查它:stackoverflow.com/a/26294966/4128242
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-24
  • 1970-01-01
相关资源
最近更新 更多