4

我有:

MyApp 使用 onCreate 扩展应用程序:

sendBroadcast(refreshAlarm);

Log.d(TAG, "broadcast sent with intent " + refreshAlarm);
Log.d(TAG, "onCreate");

在哪里

static final Intent refreshAlarm = new Intent(ACTION_REFRESH_RECEIVER);
public static final String ACTION_REFRESH_RECEIVER = "com.example.myapp.REFRESH_RECEIVER";

广播接收器:

package com.example.myapp;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.preference.PreferenceManager;
import android.util.Log;

public class RefreshReceiver extends BroadcastReceiver
{
    private static final String TAG = "RefreshReceiver";

    @Override
    public void onReceive(Context context, Intent intent)
    {
        Log.d(TAG, "broadcast received with intent " + intent);
        long interval = Long
                .parseLong(PreferenceManager.getDefaultSharedPreferences(
                        context).getString("delay", "900")) * 1000;

        PendingIntent operation = PendingIntent.getService(context, -1,
                new Intent(context, RefreshService.class),
                PendingIntent.FLAG_UPDATE_CURRENT);

        AlarmManager alarmManager = (AlarmManager) context
                .getSystemService(Context.ALARM_SERVICE);

        alarmManager.cancel(operation);

        if (interval > 0)
        {
            alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,
                    System.currentTimeMillis(), interval, operation);
        }

        Log.d(TAG, "onReceive: delay = " + interval);
    }
}

在清单中声明:

<receiver android:name="com.example.myapp.RefreshReceiver" >
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
         <action android:name="com.example.myapp.REFRESH_RECEIVER" />
    </intent-filter>
</receiver>

在我看来,我拥有完成这项工作所需的一切。广播是在 onCreate 中发送的(我可以在日志中看到它确实是发送的)。使用意图过滤器声明广播以接收refreshAlarm意图,但它没有收到它,我不知道为什么。我还需要什么吗?

4

5 回答 5

4

如果您放入BroadCastReceivermainfest.xml ,则无需在代码中注册它,仅当您在代码中创建它时才在代码中注册它

这是这里的例子:

 <receiver android:name="MyReceiver" >
        <intent-filter>
            <action android:name="android.mybroadcast" />
        </intent-filter>
    </receiver>

在这里从你的类文件中调用它,

Intent intent = new Intent();
intent.setAction("android.mybroadcast");
sendBroadcast(intent);
于 2013-08-24T22:54:19.920 回答
1

尝试以编程方式注册您的广播接收器

public void registerBroadcastReceiver(View view) {

    this.registerReceiver(broadCastReceiver, new IntentFilter(
            "com.example.myapp.REFRESH_RECEIVER"));
    Toast.makeText(this, "Enabled broadcast receiver", Toast.LENGTH_SHORT)
            .show();
}

并以此注销

        public void unregisterBroadcastReceiver(View view) {

    this.unregisterReceiver(broadCastReceiver);

    Toast.makeText(this, "Disabled broadcst receiver", Toast.LENGTH_SHORT)
            .show();
}
于 2013-08-24T22:41:54.860 回答
1

它可能无法正常工作,因为您的 Receiver 和您用于在清单中注册的包名称不匹配。

确保您的包裹名称与接收者的相应包裹相匹配。

于 2013-08-24T22:48:50.880 回答
0

我有同样的问题。似乎已注册的广播接收器仅适用于系统操作。使用我的自定义操作,只要我的应用程序正在运行(活动在活动堆栈中),它就可以工作。

我的解决方法是为它创建一个活动。这在后台不起作用,但是它使您可以从其他应用程序中捕获事件

    <activity android:name=".ImportToProActivity">
        <intent-filter>
            <action android:name="com.sourcecastle.logbook.ImportToProActivity"/>

        </intent-filter>
    </activity>


 Intent intent = new Intent();
 intent.setComponent(new ComponentName("com.sourcecastle.freelogbook", "com.sourcecastle.logbook.ImportToProActivity"));
 startActivity(intent);
于 2017-03-25T09:30:37.460 回答
0

你说

MyApp 扩展应用程序

您应该在 android manifest 中将 MyApp 注册为应用程序。

将此行放在 android manifest 应用程序元素中

android:name="你的.package.MyApp"

其中 your.pacakage 是 MyApp 文件所在的包。现在您的应用程序元素应如下所示

<application
    android:name="your.package.MyApp"
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/yourTheme" >
于 2015-08-21T12:07:33.660 回答