Что я хочу, так это, во-первых, сигнал тревоги будет реализован в части onCreate в MainActivity .
Затем в определенное время, когда onReceive void получит pendingIntent, onReceive void вызовет другой void в MainActivity. Это делается путем создания интерфейса и пустого void, чтобы onReceive мог вызвать одноименный метод в MainActivity.
Наконец, onReceive void решит, следует ли отправлять уведомление в зависимости от результата вызванного void из MainActivity через интерфейс.
Я пытался сослаться на этот ответ и изменить его в своем скрипте, но он возвращает ошибку
Код: Выделить всё
Process: com.example.sahelper, PID: 5930
java.lang.RuntimeException: Unable to instantiate receiver com.example.sahelper.alarm.AlarmReceiver: java.lang.InstantiationException: java.lang.Class has no zero argument constructor
Код: Выделить всё
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// AlarmController is used to schedule alarm
AlarmController alarmController =
new AlarmController(MainActivity.this, MainActivity.this);
alarmController.new_test_alarm(); // schedule an alarm
}
// This method is supposed to be called by interface
@Override
public void check_duty()
{
// Do something here...
// Do something here...
// Do something here...
}
Код: Выделить всё
// Constructor
public AlarmController(Activity activity, Context context)
{
this.myactivity = activity;
this.mycontext = context;
}
public void new_test_alarm()
{
// Some codes here...
// Some codes here...
// Some codes here...
Intent intent = new Intent(myactivity, AlarmReceiver.class);
intent.setAction(SECOND_DEADLINE_ALARM_RECEIVE_ACTION);
PendingIntent pendingIntent = PendingIntent.getBroadcast(
mycontext,
Integer.parseInt(it.getKey()), // Here is the noti_id
intent,
FLAG_MUTABLE);
AlarmManager alarmManager = (AlarmManager) myactivity.getSystemService
(Context.ALARM_SERVICE);
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,
(System.currentTimeMillis() + 10 * 1000),
pendingIntent);
}
Код: Выделить всё
public interface Receiver_MainActivity_Interface
{
public void check_duty();
}
Код: Выделить всё
public class AlarmReceiver extends BroadcastReceiver
{
private Receiver_MainActivity_Interface mylistener;
public AlarmReceiver(Receiver_MainActivity_Interface listener)
{
this.mylistener = listener;
}
@Override
public void onReceive(Context context, Intent intent)
{
if (Objects.equals(intent.getAction(), SECOND_DEADLINE_ALARM_RECEIVE_ACTION))
{
mylistener.check_duty();
// And some codes here continue...
// And some codes here continue...
// And some codes here continue...
}
}
}
Что мне делать, чтобы решить проблему? Любое предложение приветствуется.
Изменить
Я не могу и не думаю, что возможно переместить void внутри mainactivity в класс onReceive, потому что этот void включает в себя некоторые элементы объявлены (WebView) в MainActivity.
Подробнее здесь: https://stackoverflow.com/questions/792 ... iver-class
Мобильная версия