android - 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);
}
}
提前致谢
解决方案
你可以去工作管理器。你可以在工作管理器中使用PeriodicTimeWorkRequest来实现重复完成的工作。Workmanager 将采取广播接收器等中的所有操作。不需要维护。参考:android中的工作管理器
推荐阅读
- batch-file - 我想在我的游戏中有一个法力系统。我该怎么做呢?
- regex - 正则表达式:在特定文本之后匹配无限行
- elasticsearch - 从 Logstash 在 Elasticsearch 上使用 geopoint
- c - 如何检测用户是否在菜单内输入字母
- r - 在R中按元素拆分字符向量?
- jquery - 过滤 div 内容后调整 div 大小
- laravel - 如何为我的水疗应用程序在 laravel 中的路线例外?
- javascript - 使用 Vue Router Global Before Guards 的无限循环
- python - 有条件地调用另一个脚本中的函数并使用它的变量
- curl - 如何在 Makefile 中转义 2 美元符号?