如何解决触发时间相距较长的警报不执行
我的目标是让程序设置警报,一旦触发每个警报,就会播放特定的音频。
问题在于,如果 set_alarm
产生的触发时间差异很小,例如第一个和最后一个触发器相隔不到 10 分钟,这会起作用。
但是如果触发时间距离大于这个值,一段时间后触发器将不会被激活,即没有声音播放。
我需要改变什么?
我尝试了什么:
清单
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="myPackage">
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.SET_ALARM"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<application
...
android:supportsRtl="true">
<service android:name=".BService" android:stopWithTask="false" />
<activity
android:name=".MainActivity">
</activity>
<receiver android:name=".Audplayer" android:exported="true" >
<intent-filter>
<action android:name="my.tag"></action>
<category android:name="android.intent.category.DEFAULT"></category>
</intent-filter>
</receiver>
</application>
</manifest>
主活动
package myPackage;
import ...
public class MainActivity extends AppCompatActivity {
Audplayer ap;
Intent i_neu;
boolean running = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
intent = new Intent(this,Audplayer.class);
ap = new Audplayer();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
IntentFilter intentFilter = new IntentFilter("my.tag");
intentFilter.addCategory(Intent.CATEGORY_DEFAULT);
registerReceiver(ap,intentFilter);
final ImageButton btnGO = (ImageButton) findViewById(R.id.btnGO);
btnGO.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!running) {
running = true;
view.setsystemUIVisibility(View.SYstem_UI_FLAG_IMMERSIVE);
i_neu = new Intent(getApplicationContext(),BService.class);
Bundle ints = new Bundle();
ints.putInt(...);
i_neu.putExtras(ints);
startService(i_neu);
} else {
stopService(i_neu);
running = false;
}
}
});
}
}
服务
package package;
import ...
public class BService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@RequiresApi(api = Build.VERSION_CODES.O)
private void notificationDialog() {
notificationmanager notificationmanager = (notificationmanager) getSystemService(Context.NOTIFICATION_SERVICE);
...
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this,NOTIFICATION_CHANNEL_ID);
notificationBuilder.setAutoCancel(true)
...
.setWhen(System.currentTimeMillis())
...
Notification not = notificationBuilder.build();
notificationmanager.notify(1,not);
startForeground(1,not);
}
Audplayer ap;
@Override
public int onStartCommand(Intent intent,int flags,int startId) {
final int whatever = intent.getIntExtra("whatever",0);
...
ap = new Audplayer();
ap.init(this);
Calendar time = Calendar.getInstance();
time.setTimeInMillis(SystemClock.elapsedRealtime());
ap.set_alarm(this,time.getTimeInMillis(),R.raw.beginn);
time.setTimeInMillis(SystemClock.elapsedRealtime()+whatever);
....
ap.set_alarm(this,R.raw.beginn);
time.setTimeInMillis(SystemClock.elapsedRealtime()+whatever2);
ap.set_alarm(this,R.raw.beginn);
return START_STICKY;
}
}
音频播放器
package myPackage;
import ...
public class Audplayer extends broadcastReceiver {
@Override
public void onReceive(Context context,Intent intent) {
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"T");
wl.acquire();
final int ResID = intent.getIntExtra("ResID",0);
final long When = intent.getLongExtra("When",0);
MediaPlayer mediaPlayer = MediaPlayer.create(context,ResID);
AudioManager mAudioManager = (AudioManager) context.getSystemService(Context.AUdio_SERVICE);
mediaPlayer.start();
while (mediaPlayer.isPlaying()) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printstacktrace();
}
}
wl.release();
}
AlarmManager alarmMgr;
Intent intent;
Bundle Resids;
public void init(Context context)
{
alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
intent = new Intent(context,Audplayer.class);
Resids = new Bundle();
}
public void setAlarm(Context context,long When,int ResID)
{
Resids.putInt("ResID",ResID);
Resids.putLong("When",When);
intent.putExtras(Resids);
PendingIntent pendingIntent = PendingIntent.getbroadcast(context,(int)When,intent,PendingIntent.FLAG_ONE_SHOT);
alarmMgr.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP,When,pendingIntent);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。