#android #android-intent #broadcastreceiver
#Android #android-намерение #broadcastreceiver
Вопрос:
MainActivity:
package com.jimmytrivedi.alarmdemo;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TimePicker;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.Calendar;
import butterknife.BindView;
import butterknife.ButterKnife;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = MainActivity.class.getSimpleName();
@BindView(R.id.timePicker)
TimePicker timePicker;
@BindView(R.id.buttonAlarm)
Button buttonAlarm;
@BindView(R.id.cancelAlarm)
Button cancelAlarm;
private AlarmManager alarmManager;
private PendingIntent pendingIntent;
private Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
cancelAlarm.setEnabled(false);
selClickListener();
}
private void selClickListener() {
buttonAlarm.setOnClickListener(this);
cancelAlarm.setOnClickListener(this);
}
@Override
public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.buttonAlarm:
Calendar calendar = Calendar.getInstance();
if (Build.VERSION.SDK_INT >= 23) {
calendar.set(
calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH),
timePicker.getHour(), timePicker.getMinute(), 0);
} else {
calendar.set(
calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH),
timePicker.getCurrentHour(), timePicker.getCurrentMinute(), 0);
}
setAlarm(calendar.getTimeInMillis());
showLog("getTimeInMillis: " calendar.getTimeInMillis() );
cancelAlarm.setEnabled(true);
break;
case R.id.cancelAlarm:
cancelAlarm();
break;
}
}
private void setAlarm(long time) {
//creating a new intent specifying the broadcast receiver
Intent intent = new Intent(this, MyAlarm.class);
intent.putExtra("REMINDER_ID", "1");
//creating a pending intent using the intent
pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
//setting the repeating alarm that will be fired every day
alarmManager.setRepeating(AlarmManager.RTC, time, AlarmManager.INTERVAL_DAY, pendingIntent);
Toast.makeText(this, "Alarm is set", Toast.LENGTH_SHORT).show();
}
private void cancelAlarm() {
pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
alarmManager.cancel(pendingIntent);
Toast.makeText(this, "Canceled", Toast.LENGTH_SHORT).show();
}
private void showLog(String msg) {
Log.d(TAG, msg);
}
}
Класс MyAlarm:
package com.jimmytrivedi.alarmdemo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.provider.Settings;
import android.util.Log;
public class MyAlarm extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String id = intent.getStringExtra("REMINDER_ID");
Log.d("Test", "ID: " id) ;
MediaPlayer mediaPlayer = MediaPlayer.create(context, Settings.System.DEFAULT_RINGTONE_URI);
mediaPlayer.start();
Log.d("Test", "Alarm just fired") ;
}
}
В MainActivity у меня есть один метод setAlarm
, использующий этот метод, который я вызываю intent для класса receiver, не знаю, почему intent становится нулевым? Кстати, onReceived вызывается и работает по-другому. Напоминание также приходит. И я также печатал журналы, это: (Log.d(«Test», «Alarm just fired») 😉 также печатается.
Почему?
Любая помощь?
Комментарии:
1. «добавлена какая-то случайная статья» звучит не очень хорошо. Почему бы вам не описать свою проблему подробнее или не добавить несколько попыток отладки?
2. Я уже описал. Кстати, вы можете мне помочь? sendBroadcast (намерение); как использовать для неактивного класса? как AlarmReceiver?
3. Если у вас есть вопрос, добавьте его в вопрос или задайте новый. Не используйте для этого раздел комментариев
4. @NicoHaas, мой мальчик, просто помоги мне
5. Ну, я все еще пытаюсь понять вашу проблему….
Ответ №1:
Я только что понял свою проблему. Используйте sendBroadcast (намерение);
private void setAlarm(long time) {
//creating a new intent specifying the broadcast receiver
Intent intent = new Intent(this, MyAlarm.class);
intent.putExtra("REMINDER_ID", "1");
sendBroadcast(intent);
//creating a pending intent using the intent
pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
//setting the repeating alarm that will be fired every day
alarmManager.setRepeating(AlarmManager.RTC, time, AlarmManager.INTERVAL_DAY, pendingIntent);
Toast.makeText(this, "Alarm is set", Toast.LENGTH_SHORT).show();
}
Ответ №2:
Вы можете легко сделать это, и это отлично работает на моей стороне, вы можете создать имя класса AlaramManger
public class AlaramManger {
private AlarmManager Alarammanager;
@SuppressLint("StaticFieldLeak")
private static AlaramManger alaramManger = null;
private Context context;
private Intent alarmIntent;
public static AlaramManger getInstance(Context context) {
if (alaramManger == null) {
alaramManger = new AlaramManger(context);
}
return alaramManger;
}
public AlaramManger(Context context) {
this.context = context;
Alarammanager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmIntent = new Intent(context, AppMonitoringBroadCastReceiver.class);
;
}
private PendingIntent createPendingIntent(Context context) {
alarmIntent.setAction(ConstantsApp.AlaramManager.START_ALARAM_SERVICE);
int DRIVER_SERVICE_RESTART_PI_REQUEST_CODE = ConstantsApp.AlaramManager.requestCode;
return PendingIntent.getBroadcast(context, DRIVER_SERVICE_RESTART_PI_REQUEST_CODE,
alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
}
public void StartRepeatingMonitorning(Context context) {
try {
Alarammanager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1 * 60 * 100, createPendingIntent(context));//first start will start asap
if (RemoteConfig.getConfig().isShowLogs())
// Toast.makeText(context, "Starting Monitering", Toast.LENGTH_LONG).show();
LogCat.show("alaram start");
} catch (Exception e) {
Utils.LogExceptionToFabric(e);
e.printStackTrace();
}
}
public void cancelRepeatingAlaram(Context context) {
try {
Alarammanager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, AppMonitoringBroadCastReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(
context, ConstantsApp.AlaramManager.requestCode, i, 0);
Alarammanager.cancel(pendingIntent);
pendingIntent.cancel();
if (RemoteConfig.getConfig().isShowLogs())
// Toast.makeText(context, "cancelRepeatingAlaram",
Toast.LENGTH_SHORT).show();
LogCat.show("alaram cancel");
} catch (Exception e) {
Utils.LogExceptionToFabric(e);
e.printStackTrace();
}
}
public boolean isRepeatingAlaramManagerExist(Context context) {
Intent myIntent = new Intent(context, AppMonitoringBroadCastReceiver.class);
myIntent.setAction(ConstantsApp.AlaramManager.START_ALARAM_SERVICE);
return (PendingIntent.getBroadcast(context,
ConstantsApp.AlaramManager.requestCode,
myIntent, PendingIntent.FLAG_NO_CREATE) != null);
}
}
И теперь вы можете получать широковещательную передачу при ее срабатывании
public class AppMonitoringBroadCastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// You can do your Stuff
}
вы можете вызвать это
if (! AlaramManger.getInstance(context).isRepeatingAlaramManagerExist(context)) {
AlaramManger.getInstance(context).StartRepeatingMonitorning(context);
}
В манифесте вы можете зарегистрировать его
<receiver android:name=".receivers.AppMonitoringBroadCastReceiver"
android:exported="false">
<intent-filter>
<action android:name="com.shahi.driver.START_SERVICE" />
</intent-filter>
</receiver>
Комментарии:
1. @Pooja singh если у вас есть какие-либо проблемы или проблемы в этом коде, скажите мне, потому что этот код протестирован на более чем 1000 устройствах
2. Вы также можете потратить свое время на StartRepeatingMonitorning, и оно устанавливается в соответствии с вашим временем.
3. Спасибо! Почему вы создали класс AlarmManager?
4. что такое ConstantsApp.AlaramManager?
5. Потому что у него есть все необходимые вам функции, такие как отмена или установка