【问题标题】:BroadcastReceiver is not working in my android appBroadcastReceiver 在我的 android 应用程序中不起作用
【发布时间】:2015-11-02 13:17:47
【问题描述】:

我有一个简单的 Android 应用程序,它包含一个广播接收器类作为 MainActivity 内的内部类。代码如下。

private class MyReceiver extends BroadcastReceiver {

    private Intent receivedIntent;

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("MyTag","onReceive function....!!!!!");

        receivedIntent = intent;
    }
}

根据一些标准教程,我可以在清单文件中为接收者设置一个静态条目。

<receiver
    android:name = ".MyReceiver"
    android:enabled = "true">
    <intent-filter>
        <action android:name = "android.intent.action.ACTION_SCREEN_OFF"/>
        <action android:name = "android.intent.action.ACTION_SCREEN_ON"/>
    </intent-filter>
</receiver>

但在我将以下几行放入 MainActivity 之前它不起作用。

IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON);

DataWriteReceiver dataWriteReceiver = new DataWriteReceiver();
this.registerReceiver(dataWriteReceiver,filter);

即使在清单文件中的条目之后,我也需要执行 registerReceiver 吗?任何帮助表示赞赏。

但我在关闭我的应用程序时遇到了另一个问题。 这就是 ADM 显示的错误。

11-02 23:01:10.178: E/ActivityThread(11121): Activity com.sony.datamoduledesignproject.MainActivity has leaked IntentReceiver com.sony.datamoduledesignproject.MainActivity$DataWriteReceiver@2911ab22 that was originally registered here. Are you missing a call to unregisterReceiver()?
11-02 23:01:10.178: E/ActivityThread(11121): android.app.IntentReceiverLeaked: Activity com.sony.datamoduledesignproject.MainActivity has leaked IntentReceiver com.sony.datamoduledesignproject.MainActivity$DataWriteReceiver@2911ab22 that was originally registered here. Are you missing a call to unregisterReceiver()?
11-02 23:01:10.178: E/ActivityThread(11121):    at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:970)
11-02 23:01:10.178: E/ActivityThread(11121):    at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:771)
11-02 23:01:10.178: E/ActivityThread(11121):    at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:2014)
11-02 23:01:10.178: E/ActivityThread(11121):    at android.app.ContextImpl.registerReceiver(ContextImpl.java:1994)
11-02 23:01:10.178: E/ActivityThread(11121):    at android.app.ContextImpl.registerReceiver(ContextImpl.java:1988)
11-02 23:01:10.178: E/ActivityThread(11121):    at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:503)
11-02 23:01:10.178: E/ActivityThread(11121):    at com.sony.datamoduledesignproject.MainActivity.intentGenerator(MainActivity.java:93)
11-02 23:01:10.178: E/ActivityThread(11121):    at com.sony.datamoduledesignproject.MainActivity.onCreate(MainActivity.java:78)
11-02 23:01:10.178: E/ActivityThread(11121):    at android.app.Activity.performCreate(Activity.java:6374)
11-02 23:01:10.178: E/ActivityThread(11121):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
11-02 23:01:10.178: E/ActivityThread(11121):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2752)
11-02 23:01:10.178: E/ActivityThread(11121):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2873)
11-02 23:01:10.178: E/ActivityThread(11121):    at android.app.ActivityThread.access$900(ActivityThread.java:181)
11-02 23:01:10.178: E/ActivityThread(11121):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1482)
11-02 23:01:10.178: E/ActivityThread(11121):    at android.os.Handler.dispatchMessage(Handler.java:102)
11-02 23:01:10.178: E/ActivityThread(11121):    at android.os.Looper.loop(Looper.java:145)
11-02 23:01:10.178: E/ActivityThread(11121):    at android.app.ActivityThread.main(ActivityThread.java:6145)
11-02 23:01:10.178: E/ActivityThread(11121):    at java.lang.reflect.Method.invoke(Native Method)
11-02 23:01:10.178: E/ActivityThread(11121):    at java.lang.reflect.Method.invoke(Method.java:372)
11-02 23:01:10.178: E/ActivityThread(11121):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
11-02 23:01:10.178: E/ActivityThread(11121):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

这里提到的 MainActivity 中的错误是在 registerReceiver() 调用上,如下所示,

DataWriteReceiver dataWriteReceiver = new DataWriteReceiver();
this.registerReceiver(dataWriteReceiver,filter);

总结是MainActivity泄露了IntentReceiver,需要unregisterReceiver()吗?

请你帮帮我。

【问题讨论】:

标签: android broadcastreceiver


【解决方案1】:

人们多次问过这种问题,我刚刚搜索过这种问题,但没有一个答案向我们显示官方的答案。所以在这里

http://developer.android.com/reference/android/content/Intent.html#ACTION_SCREEN_ON

http://developer.android.com/reference/android/content/Intent.html#ACTION_SCREEN_OFF

记住:Android 官方文档会让你对 Android 有更好的基本了解,不是有时,而是几乎每次。

【讨论】:

  • 谢谢!现在对我来说还可以,但也许我会发现Android官方以后不会告诉我一些事情。 :-)
  • 最后一句只是为了让我记住阅读Android官方文档的重要性,是的,不是100%。 :-) :-) :-)
  • 没错,如果应该阅读:"... not sometimes,but ALMOST everytime" 当然阅读官方文档是必须的,很多人并不关心...
  • 我采纳了你的说法!是的,我非常同意你的观点,而且我遇到过很多不关心官方文档的人。
  • 谢谢。我正是这样做的。现在可以识别操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-15
相关资源
最近更新 更多