Android广播接收器无法接收意图。

17

我有两个自己开发的应用程序,试图从一个应用程序向另一个发送意图(Intent),但是该意图从未到达onReceive()。不过这个问题只是单向的。第一个应用可以发送到第二个应用,但第二个应用无法回传信息。我正在使用不同的意图操作(intent action)从第二个应用程序发送到第一个应用程序,但除此之外它们是相同的。你有什么想法为什么会出现这种情况吗?我尝试了我能想到的所有方法,并阅读了大部分我能在这里找到的帖子,但一切都无济于事。

它没有崩溃或给我任何指示,以表明在logcat中发生了什么,就像什么都没发生一样。

发送功能

private void sendFinishLog(String ID, String Cond)
{
    Log.d("me", "send finish log");
    Intent logIntent = new Intent();
    logIntent.putExtra("ID", ID);
    logIntent.putExtra("Cond", Cond);
    logIntent.setAction("com.me.intent.finishlog");
    Log.d("me","logIntent : " + logIntent.toString()   
        +logIntent.getExtras().toString());
    sendBroadcast(logIntent);
}

收到课程

public class LogReceiver extends BroadcastReceiver {

    public static ArrayList<LogDataHolder> logData = new ArrayList<LogDataHolder>();
    private boolean found;
    static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    private static String lasttime;
    private static String now = "Boot time";
    @Override
    public void onReceive(Context cont, Intent logIntent) 
    {
        Log.d("me","On receive");
                etc.....
    }
收到应用程序清单。
<!-- for receiving logs  -->
<receiver 
    android:name = "LogReceiver"
    android:enabled="true">
    <intent_filter>
        <action android:name="com.me.intent.finishlog" />
    </intent_filter>
</receiver>

1
你注册了接收器吗? - bofredo
这不是同一件事吗?我希望它始终处于监听状态,以便在触发时随时可以捕获,因此从我的理解来看,显式方式是更好的选择。 - Cob50nm
4个回答

9

something like:

public void onResume() {
    IntentFilter filter = new IntentFilter();
    getActivity().registerReceiver(mLogReceiver,filter);
}

取消注册的操作:

public void onPause() {
    getActivity().unregsiterReceiver(mLogreceiver);
}

编辑: 我刚刚发现您的LogReceiver类也没有构造函数。您需要写一个构造函数:

private LogReceiver mLogReceiver = new LogReceiver() {

接着,您可以像代码中已经使用的那样使用onReceive方法。


1
重写的onReceive方法必须在我的最后一行的{}内部。 - bofredo
构造函数也适用吗? - bofredo
不确定是这个答案还是所有答案的组合,但它已经起作用了,所以谢谢。之前我没有用过这个,不确定为什么现在需要它,但它能工作,现在这就是最重要的。 - Cob50nm
1
哈哈,至少你学会了有时候只需要坚持不懈地编码 :-) - bofredo
1
@bofredo 你的方法不应该调用 super.onResume()super.onPause() 吗? - ban-geoengineering

5
尝试按照以下方式再次操作。可能需要添加类别。
<receiver
    android:name = "LogReceiver"
    android:enabled="true">
    <intent-filter>
        <action android:name="com.me.intent.finishlog" />
         <category android:name="android.intent.category.DEFAULT"/> 
    </intent-filter>
</receiver>

默认值是什么意思呢?它是指标准的Android值,还是可以用于自定义意图操作? - Cob50nm
如果您不需要添加一个动作,那么就不需要添加类别。但是如果您添加了动作,我认为有必要添加一个类别来指示如何使用这个动作。 - Eden

2

当我将接收器取消注册从OnPause()方法中移除时,我的问题得到了解决。


1
您在清单文件中将接收器声明为:

    android:name = "LogReceiver"

文档指出,name应该是:

实现广播接收器的类的名称,它是BroadcastReceiver的子类。这应该是一个完全限定的类名(例如,“com.example.project.ReportReceiver”)。然而,作为一种简写,如果名称的第一个字符是句点(例如,“.ReportReceiver”),它将附加到在元素中指定的包名称。

换句话说,它需要包含包名。尝试将名称更改为:

    android:name = ".LogReceiver"

or

    android:name = "com.me.yourpackagename.LogReceiver"

发布一个完整的项目。 - Sofi Software LLC
2
整个项目超过50,000行代码,所以这并不是一个可行的选择。 - Cob50nm
2
然后创建一个仅涉及接收器的小项目。 - Sofi Software LLC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接