使用URI读取QR码 - > BroadcastReceiver被忽略,而Activity工作正常

时间:2013-08-13 12:00:09

标签: android android-intent android-activity broadcastreceiver

我正在尝试根据我的wn URI收到一个简单的自定义意图。

这是我的清单:

<uses-sdk
    android:minSdkVersion="14"
    android:targetSdkVersion="17" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.example.intenttest.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <receiver
        android:name="com.example.intenttest.TestReceive"
        android:enabled="true"
        android:exported="true" >
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />

            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />

            <data android:scheme="testo" />
        </intent-filter>
    </receiver>
</application>

我的接收器非常简单:

public class TestReceive extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent arg1) {
    Log.d("", "YAY!!!!!");

        Toast.makeText(context, "TEST!!!", Toast.LENGTH_LONG).show();
    }

}

当我尝试通过URI Launer浏览testo:// blahblah或fir这个意图时,我的接收器没有被解雇。

以下是模拟从其他应用程序触发意图的代码:

        String url = "testo://test/test";
        Intent i = new Intent(Intent.ACTION_VIEW);
        i.setData(Uri.parse(url));
        sendBroadcast( i );

但是,当我将<intent-filer>块移动到清单中的<activity>标记时,活动就会被触发。

如何让我的接收者接收意图?

2 个答案:

答案 0 :(得分:1)

如果您尝试动态注册接收器,则应以编程方式执行此操作。 This example Eric Nordvik将为您提供良好的服务!

现在,这样做的主要原因是因为它很直接。缺点是当您的应用程序的生命周期当前不活动时(pausedstopped),您将无法接收广播。

更新:正如评论中所述,OP需要接收与活动生命周期无关的广播。我会敦促任何人重新考虑他的设计,然后才决定是否真的需要它。

根据official documentation的指定,android:name用于指定实现BroadcastReceiver的类的名称。在代码中省略它意味着Activity本身将接收广播。我相信您的问题是您没有通过android:name对其进行完全限定,而是将其称为name。修复它也应该解决你的问题!

更新:OP已经纠正了错字,这不是问题。此时,我最好的猜测是广播生成错误,或者BroadcastReceiver的引用应使用简写符号android:name=".NameOfReceiverClass"

答案 1 :(得分:0)

好的 - 整个问题可能是由于我采取了错误的方法。 用于发送意图DOES的示例代码工作并启动我的接收器。

因此,市场上的大多数QR读者似乎都没有像我的示例代码那样使用QR读取URI激发意图,而是寻找应该响应它然后直接调用它的活动。

我不知道为什么会这样。

解决方案是创建一个静态Activity,它处理BroadcastReceiver应该处理的内容。

Oy vey。