Диспетчер аварийных сигналов не запускает службу - PullRequest
0 голосов
/ 03 октября 2019

Я застрял с простым диспетчером аварий на несколько дней. Ожидается, что Alarm Manager запустит службу, но проблема в том, что она не запускает службу.

Моя Основная активность :

public class MainActivity extends Activity {
private Button start 
private Button stop

@Override
protected void onCreate (Bundle _savedInstanceState){
super.onCreate (_savedInstanceState);
setContentView(R.layout.main);
initialize(_savedInstanceState);
initializeLogic();
}

private void initialize(Bundle _savedInstanceState) {
start = (Button) findByViewId(R.id.start);
stop = (Button) findByViewId(R.id.stop);

start.setOnClickListener(new View.onClickListener(){
@Override
public void onClick(View _view){
startAlert();
}});

stop.setOnClickListener(new View.onClickListener(){
@Override
public void onClick(View _view){
stopAlert();
}});

private void initializeLogic(){}

@Override
protected void onActivityResult(int _requestCode, int _resultCode, Intent _data){
super.onActivityResult(_requestCode, _resultCode, _data);
switch (_requestCode){
default:
break;
}}

public void startAlert() {
int i = 5;
Intent intent = new Intent(this, MyBroadcastReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 234324243, intent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (i * 1000), pendingIntent);
Toast.makeText(this, "Alarm set in " + i + " seconds", Toast.LENGTH_LONG).show();
}

public void stopAlert() {
Intent intent = new Intent(this, MyBroadcastReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 234324243, intent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.cancel(pendingIntent);
Toast.makeText(this, "Alarm stopped", Toast.LENGTH_LONG).show();
}

}

Моя BroadcastReceiver:

public class MyBroadcastReceiver extends BroadcastReceiver 
{    
    @Override
    public void onReceive(Context context, Intent intent) 
    {   

Toast.makeText(context, "Intent received", Toast.LENGTH_LONG).show();
Intent intent = new Intent(this, MyService.class); 
context.startService(intent);
    }
}

Моя Служба :

public class MyService extends Service {
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Toast.makeText(this, "onStartCommand Called", Toast.LENGTH_LONG).show();
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Toast.makeText(this, "onDestroy Called", Toast.LENGTH_LONG).show();
    }
}

Я зарегистрировал службу и BroadcastReceiver в манифесте. Следуя нескольким предложениям по работе со стеком, я попробовал «MyService» (без.), Но он все еще не работает.

<service android:name=".MyService" /> 
<receiver android:name=".MyBroadcastReceiver" />
  1. Я пытался вызывать startService и stopService напрямую с кнопок «Пуск» и «Стоп» иэто работает отлично. Я получаю «onStartCommand звонил» и «onDestroy звонил».
  2. Когда я устанавливаю будильник, он не запускает службу, что означает, что есть какая-то проблема либо с AlarmManager, либо с BroadcastReceiver. Я получаю тексты «Тревога установлена ​​через 5 секунд» и «Тревога остановлена», когда я нажимаю кнопки Старт или Стоп соответственно, но я не получаю «Намерение получено» через 5 секунд.

Я попробовал несколько примеровдоступны на этом форуме или других сайтах, но у меня ничего не работает. Кто-нибудь может подсказать, пожалуйста, что я делаю не так?

1 Ответ

0 голосов
/ 03 октября 2019

Вы можете использовать приведенный ниже код, сначала убедитесь, что вы зарегистрировали свой приемник и службу вещания следующим образом:

<service android:name="YOUR_PACKAGE_NAME.MyService"/>
<receiver android:name="YOUR_PACKAGE_NAME.MyBroadcastReceiver"/>

Вам также следует проверить наличие недостающих фигурных скобок в вашем классе MainActivity.java. Вы можете сравнить его с приведенным ниже кодом для справки

public class MainActivity extends AppCompatActivity {
    private Button start;
    private Button stop;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initialize(savedInstanceState);
    }

    private void initialize(Bundle savedInstanceState)
    {
        start = (Button) findViewById(R.id.start);
        stop = (Button) findViewById(R.id.stop);

        start.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view)
            {
                startAlert();
            }
        });

        stop.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view)
            {
            stopAlert();
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data)
    {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode)
        {

        }
    }

    public void startAlert() {
        int i = 5;
        Intent intent = new Intent(this, MyBroadcastReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 234324243, intent, 0);
        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (i * 1000), pendingIntent);
        Toast.makeText(this, "Alarm set in " + i + " seconds", Toast.LENGTH_LONG).show();
    }

    public void stopAlert() {
        Intent intent = new Intent(this, MyBroadcastReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 234324243, intent, 0);
        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        alarmManager.cancel(pendingIntent);
        Toast.makeText(this, "Alarm stopped", Toast.LENGTH_LONG).show();
    }
}

И, наконец, вам нужно внести небольшие изменения в свой класс BroadcastReceiver, где имя объекта намерения должно быть изменено на что-то другое, кроме intent, следующим образом:

public class MyBroadcastReceiver extends BroadcastReceiver 
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        Toast.makeText(context, "Intent received", Toast.LENGTH_LONG).show();
        Intent serviceIntent = new Intent(context, MyService.class);
        context.startService(serviceIntent);
    }
}

Надеюсь, это решит вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...