我正在制作一个Android应用程序,用于帮助恢复丢失的手机。该应用程序使用持续运行的服务,当手机接收到文本消息(SMS)时,会触发BroadcastReceiver(已在服务中注册)onReceive()事件。我想要的功能是,即使手机处于静音状态,BroadcastReceiver也能够使手机产生很大的噪音。我能想到的最合理的方法是使用和当前时间一分钟设置的闹钟。
这是我目前在广播接收器中使用的代码:
Calendar c = Calendar.getInstance();
Intent alarmIntent = new Intent(AlarmClock.ACTION_SET_ALARM);
alarmIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
alarmIntent.putExtra(AlarmClock.EXTRA_MESSAGE, "Polo!");
alarmIntent.putExtra(AlarmClock.EXTRA_HOUR, c.get(Calendar.HOUR_OF_DAY));
alarmIntent.putExtra(AlarmClock.EXTRA_MINUTES, c.get(Calendar.MINUTE) + 1);
context.startActivity(alarmIntent);
幸运的是,这段代码有效,但它只能运行一次。但我的意思是,第一次运行此代码时,手机的流量会中断,时钟应用程序会以新的闹钟设置打开。当您再次尝试执行此操作时,会打开时钟应用程序,但不会设置警报。我必须重新启动手机才能让它再次运行。
据我所知,这个问题与时钟应用程序有关,我需要重新启动时钟应用程序以使我的服务正常工作。这是一个非常粗略的解决方案,但我不知道还能做什么。
有什么建议吗?
答案 0 :(得分:0)
诀窍是开发自己的警报屏幕并在onCreate时重新设置警报。 像那样,你的应用程序将不断响起。
为此: 初始化WakefulBroadcastReceiver
的manifest.xml
<receiver android:name="com.mycompany.myapp.AlarmManagerBroadcastReceiver"></receiver>
AlarmManagerBroadcastReceiver.java
public class AlarmManagerBroadcastReceiver extends WakefulBroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Calendar c = Calendar.getInstance();
Intent alarmIntent = new Intent(context, MyAlarm.class);
alarmIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
alarmIntent.putExtra(AlarmClock.EXTRA_MESSAGE, "Polo!");
alarmIntent.putExtra(AlarmClock.EXTRA_HOUR, c.get(Calendar.HOUR_OF_DAY));
alarmIntent.putExtra(AlarmClock.EXTRA_MINUTES, c.get(Calendar.MINUTE) + 1);
context.startActivity(alarmIntent);
}
}
MyAlarm.java:
public class MyAlarm extends Activity{
@Override
public void onCreate(Bundle savedInstanceState){
// doing UI stuff
AlarmUtil.setAlarm(this);
}
}
AlarmUtil.java
public class AlarmUtil {
@SuppressLint("NewApi")
public static void setAlarm(Context context){
AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
int requestCode = 1234;
Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(context, requestCode, intent, PendingIntent.FLAG_CANCEL_CURRENT);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
am.setExact(AlarmManager.RTC_WAKEUP, 60 * 1000, pi);
}
else{
am.set(AlarmManager.RTC_WAKEUP, 60 * 1000, pi);
}
}
}