Намерение получить значение null в onReceive в классе MyAlarm, даже если во время отправки я сидел putExtra - PullRequest
0 голосов
/ 11 апреля 2019

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, использующий этот метод, я вызываю намерение для класса получателя. Не знаете, почему намерение становится нулевым? Кстати, по приему звонил и работает другими вещами. Напоминание также идет. И я также напечатал журналы, это: (Log.d («Тест», «Тревога только что сработала»);) также печатает.

Почему?

Любая помощь?

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

Вы можете легко сделать этот материал и его работу совершенно на моей стороне. Вы можете сделать имя класса 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>
0 голосов
/ 11 апреля 2019

Я только что понял свою проблему. Используйте 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();

    }
...