首页 > 解决方案 > Android:多个自定义广播接收器不起作用

问题描述

如果我在这里有很长的问题,我很抱歉,但是花了三天时间,我找不到解决方案

在我的应用程序中,我尝试制作一些类似什么应用程序或信使的东西,不同之处在于用户将他的短信发送到服务器上的 MySql DB,我的客户服务团队将回答此消息

在这里我有两种情况有时会需要它

第一种:当应用没有连接或无法与服务器联系时,应用会检查连接并尝试每1分钟发送一次消息。

第二种:当用户发送消息成功后,应用程序会每隔 3 分钟检查一次 DB 上是否有回复。

因为我对android很陌生,而且我不能使用firebase,因为如果我的应用程序有很多用户,费用会很高!我正在考虑使用服务在每种情况下使用广播接收器启动警报。

注意:这两种情况永远不会同时发生。因此,服务或警报永远不会一起工作。

如果我们没有连接将启动第一个,当它完成后,它的工作将关闭并启动第二个。如果我们有连接将只启动第二个服务。

我将通过在活动中使用 if 语句的 sharedPreferences 条目来控制它, 例如:如果 sharedPreferences 有值,则启动服务,如果另一个值停止它

这里的问题... 第一个服务及其警报和接收器在我需要的指定时间内成功工作

但是第二个没有 服务只会启动,但警报和接收器不启动

我不知道我哪里做错了

这是清单代码:

        <service
        android:name=".SECONDservice"
        android:enabled="true"
        android:exported="false"/>

        <service
        android:name=".FIRSTservice"
        android:enabled="true"
        android:exported="false" />

        //This is my FIRST alarm (I changed the names to explain the example)
        <receiver
        android:name=".FIRSTalarm"
        android:process=":remote"/>

        <receiver
        android:name=".SECONDalarm"
        android:process=":remote"/>

        //This receiver to check if the phone reboot and the app need to start service again.
        <receiver android:name=".AlarmAutoStart">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>

这是第一个服务代码:

public class FIRSTservice extends Service {

FIRSTalarm FIRSTalarm = new FIRSTalarm();
    public void onCreate ()
    {
        super.onCreate();
    }

    @Override
    public int onStartCommand (Intent intent,int flags, int startId)        {
        FIRSTalarm.setAlarm(this);
        return START_STICKY;
    ...

第一个报警代码:

public class FIRSTalarm extends BroadcastReceiver {
    @Override
    public void onReceive(final Context context, Intent intent)
    {
        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"MyAPP:mytag");

        wl.acquire();

        // My Check Connection code here


        wl.release();
    }

    public void setAlarm(Context context)
    {
        AlarmManager am =(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        Intent i = new Intent(context, FIRSTalarm.class);
        PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
        am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 60000, pi); // Millisec * Second * Minute
    }

    public void cancelAlarm(Context context)
    {
        Intent intent = new Intent(context, FIRSTalarm.class);
        PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(sender);
    }
}

这是第二个服务代码:

public class SECONDservice extends Service {T

SECONDalarm SECONDalarm = new SECONDalarm();
    public void onCreate ()
    {
        super.onCreate();
    }

    @Override
    public int onStartCommand (Intent intent,int flags, int startId)        {
        SECONDalarm.setAlarm(this);
        return START_STICKY;
    ...

以上所有工作都在指定时间成功

此警报中的问题(不起作用)

第二个报警代码

public class SECONDalarm extends BroadcastReceiver {
@Override
public void onReceive(final Context context, Intent intent) {
    PowerManager pm2 = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
    PowerManager.WakeLock wl2 = pm2.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"MyAPP:mytag2");

    wl2.acquire();

    // My code.
    Toast.makeText(context, "Second Alarm start?!!", Toast.LENGTH_LONG).show(); // For example


    wl2.release();
}

public void setAlarm(Context context)
{
    AlarmManager am2 =( AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    Intent i2 = new Intent(context, SECONDalarm.class);
    PendingIntent pi2 = PendingIntent.getBroadcast(context, 1, i2, 0);
    am2.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 180000, pi2);
}

public void cancelAlarm(Context context)
{
    Intent intent3 = new Intent(context, SECONDalarm.class);
    PendingIntent sender3 = PendingIntent.getBroadcast(context, 1, intent3, 0);
    AlarmManager alarmManager3 = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    alarmManager3.cancel(sender3);
}
}

提前致谢

标签: androidbroadcastreceiver

解决方案


你可以去工作管理器。你可以在工作管理器中使用PeriodicTimeWorkRequest来实现重复完成的工作。Workmanager 将采取广播接收器等中的所有操作。不需要维护。参考:android中的工作管理器


推荐阅读