#android #broadcastreceiver #alarmmanager
#Android #broadcastreceiver #alarmmanager
Вопрос:
Я новичок в Android. Я пытаюсь создать приложение, которое использует BroadcastReceiver
для выполнения функции основного действия, вызванного повторяющимся сигналом тревоги. Я читал, что мне пришлось динамически регистрировать broadcastReceiver
то, что я сделал — это для того, чтобы иметь возможность выполнять функцию в основном действии. Проблема, с которой я сталкиваюсь, заключается в том, что как только приложение выходит, alarm
оно перестает работать. Я читал, что это сделано специально — есть ли способ преодолеть это или мне нужно использовать service
? Заранее спасибо.
Пример кода:
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "from AlarmReceiver", Toast.LENGTH_SHORT).show();
}
}
public class MainActivity extends AppCompatActivity {
private PendingIntent pendingIntent;
private AlarmManager manager;
private AlarmReceiver myReceiver = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myReceiver = new AlarmReceiver();
IntentFilter myIntentFilter = new IntentFilter("ANY_ACTION");
registerReceiver(myReceiver, myIntentFilter);
Intent myIntent = new Intent();
myIntent.setAction("ANY_ACTION");
pendingIntent = PendingIntent.getBroadcast(this, 0,myIntent,0);
}
public void startAlarm(View view) {
manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
int interval = 1500;
manager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent);
Toast.makeText(this, "Alarm Set", Toast.LENGTH_LONG).show();
}
}
Комментарии:
1. Покажите свой код, сигналы тревоги работают, даже когда ваше приложение не запущено. developer.android.com/training/scheduling/alarms.html
2. Спасибо, Умаров, я добавил пример кода, который показывает мою точку зрения, которая заключается в том, что когда приложение is существует, сообщения от AlarmReceiver перестают отображаться.
Ответ №1:
Я думаю, причина, по которой ваш будильник перестает работать, когда ваше приложение не запущено, заключается в том, что вы регистрируете свой AlarmReceiver локально registerReceiver
. Если вы хотите зарегистрировать свой AlarmReceiver, чтобы он продолжал работать, даже когда ваше приложение не запущено, вам нужно зарегистрировать его внутри AndroidManifest.xml
.
Во-первых, добавьте ваш приемник в AndroidManifest.xml
вот так:
<application>
//...
<receiver android:name=".AlarmReceiver">
</receiver>
//...
</application>
И установите будильник следующим образом (помните: не устанавливайте слишком короткий интервал будильника, установите не менее 1 минуты; вы устанавливаете интервал 1,5 секунды в коде ur — это может не сработать):
int interval = 60 * 1000;
Intent intent=new Intent(this, AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 1, intent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent);
И просто делайте то, что вы хотите сделать, когда срабатывает сигнал тревоги внутри onRecieve:
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
AudioManager audioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
SharedPreferences sharedPreferences = context.getSharedPreferences("Settings", 0);
int iDefValue=0;
int iDayAlarmVal= sharedPreferences.getInt("something", iDefValue);
// and so on...
}
}
Комментарии:
1. Еще раз спасибо. Если я зарегистрирую его в манифесте, сигнал тревоги сработает, правда, но, как упоминалось вверху, мне нужно динамически зарегистрировать его, чтобы иметь возможность вызывать функцию, определенную в Main-Activity. Где вы упоминаете «// … на самом деле мне нужно вызвать функцию, которая определена в основном действии.
2. что именно вы хотите делать при срабатывании будильника?
3. Для вызова функции, определенной в основном действии, т.Е. onReceive (…), будет иметь что-то вроде «myMain. DayExecute();» который определен в основном действии.
4. Я понял. Не могли бы вы показать свой код внутри функции DayExecute()?
5. Я прошу ввести код ur, потому что я думаю, что вы также сможете выполнить свою операцию внутри onReceive.