Android:多个自定义广播接收器不起作用

时间:2019-06-13 03:54:07

标签: android broadcastreceiver

很抱歉,如果我在这里遇到了很多问题,但是花了三天时间,我找不到解决办法

在我的应用程序中,我尝试制作诸如Whats App或Messenger之类的东西,不同之处在于用户会将文本消息发送到服务器上的MySql DB,而我的客户服务团队将回答此消息

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

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

第二个::当用户成功发送消息时,应用程序将每隔3分钟检查一次是否已在数据库上得到答复。

因为我是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);
}
}

预先感谢

1 个答案:

答案 0 :(得分:0)

u可以使用 workmanager 。您可以在工作管理器中使用 PeriodicTimeWorkRequest 来重复完成工作。 Workmanager将在广播接收器中执行所有操作,等等。不需要维护它。 请参阅:Work manager in android