Android 在MyAlarm类的onReceive中,即使我在发送Intent时坐在putExtra中,Intent也会变为null
主要活动:Android 在MyAlarm类的onReceive中,即使我在发送Intent时坐在putExtra中,Intent也会变为null,android,android-intent,broadcastreceiver,Android,Android Intent,Broadcastreceiver,主要活动: 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; i
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
使用该方法调用receiver类的intent不知道intent为什么变为null?顺便说一句,onReceived Call和works还有其他事情。提醒也来了。我还打印了日志,这个:(Log.d(“Test”,“刚刚触发的报警”);)也在打印
为什么?
有什么帮助吗?我刚刚解决了我的问题。 使用发送广播(意图)强>
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();
}
你可以很容易地做这件事,它的工作完美地在我这边 您可以创建一个类名
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>
“添加了一些随机文章”听起来不太好。为什么不进一步描述您的问题,或者添加一些调试尝试呢?我已经描述过了。顺便说一句,你能帮我吗?发送广播(意图);如何使用非活动类?如AlarmReceiver?如果您有问题,请将其添加到问题中或提出新问题。不要将注释部分用于that@NicoHaas,我的孩子帮帮我吧,我还在努力理解你的问题…@Pooja singh如果你在这段代码中有任何问题或问题,请告诉我,因为这段代码在1000多台设备上进行了测试。你也可以通过time Start重复监控,并根据你的时间进行设置。谢谢!为什么创建AlarmManager类?什么是ConstantsApp.AlamManager?因为它具有您所需的所有功能,如取消或设置