android - Android 通知和广播接收器和 JobScheduler
问题描述
我通过堆栈溢出查看了答案,似乎每个人都有不同的做事方式。
我想做的在理论上很简单:每天上午 10 点,我希望 android 运行某些代码,并在找到或未找到某些内容时通知用户。
我正在使用警报管理器和通知管理器。
我找到了一些很好的例子,它们都很好用!但我需要那个缺失的链接!!
主要活动:
public class MainActivity extends AppCompatActivity {
private PendingIntent pendingIntent;
Button btnStart;
Button btnStop;
Button btnStart10;
private NotificationManagerCompat notificationManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
notificationManager = NotificationManagerCompat.from(this);
btnStart = (Button) findViewById(R.id.startAlarm);
/* Retrieve a PendingIntent that will perform a broadcast */
Intent alarmIntent = new Intent(MainActivity.this, MyBroadcastReceiver.class);
pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, alarmIntent, 0);
findViewById(R.id.stopAlarm).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cancel();
}
});
findViewById(R.id.startAlarmAt10).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startAt10();
}
});
}
public void cancel() {
AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
manager.cancel(pendingIntent);
Toast.makeText(this, "Alarm Canceled", Toast.LENGTH_SHORT).show();
}
public void startAt10() {
AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
int interval = 1000 * 60;// * 20;
Log.e("Hello", "hello");
/* Set the alarm to start at 10:00 AM */
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 10);
calendar.set(Calendar.MINUTE, 00);
/* Repeating interval */
manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
AlarmManager.INTERVAL_DAY, pendingIntent);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.e("Hello", "good bye");
cancel();
}
public void sendOnChannel1(View v) {
String title = "Title 1";
String message = "This is a message for channel 1";
Notification notification = new NotificationCompat.Builder(this, App.CHANNEL_1_ID)
.setSmallIcon(R.drawable.ic_launcher_foreground)
.setContentTitle(title)
.setContentText(message)
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setCategory(NotificationCompat.CATEGORY_EVENT)
.build();
notificationManager.notify(1, notification);
}
}
这是我的广播接收器:
public class MyBroadcastReceiver extends BroadcastReceiver {
MainActivity mainActivity;
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Alarm....", Toast.LENGTH_LONG).show();
Log.e("Hello","hello2");
mainActivity = new MainActivity();
mainActivity.sendOnChannel1();
}
}
我很确定我在那里做了什么“mainActivity = new MainActivity();” 不是好的编程。但我得到一个空指针异常......
/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.notifications1, PID: 13954
java.lang.RuntimeException: Unable to start receiver com.example.notifications1.MyBroadcastReceiver: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
at android.app.ActivityThread.handleReceiver(ActivityThread.java:3388)
at android.app.ActivityThread.access$1200(ActivityThread.java:199)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1661)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
at android.content.ContextWrapper.getResources(ContextWrapper.java:91)
at android.view.ContextThemeWrapper.getResourcesInternal(ContextThemeWrapper.java:127)
at android.view.ContextThemeWrapper.getResources(ContextThemeWrapper.java:121)
at android.support.v7.app.AppCompatActivity.getResources(AppCompatActivity.java:543)
at android.app.Notification$Builder.<init>(Notification.java:3246)
at android.app.Notification$Builder.<init>(Notification.java:3228)
at android.support.v4.app.NotificationCompatBuilder.<init>(NotificationCompatBuilder.java:65)
at android.support.v4.app.NotificationCompat$Builder.build(NotificationCompat.java:1585)
at com.example.notifications1.MainActivity.sendOnChannel1(MainActivity.java:114)
at com.example.notifications1.MyBroadcastReceiver.onReceive(MyBroadcastReceiver.java:22)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:3379)
at android.app.ActivityThread.access$1200(ActivityThread.java:199)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1661)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
我计划在broadcastReceiver.java中使用JobScheduler(运行代码以比较是否需要通知),这是一个好习惯吗?
我尝试获取上下文或应用程序。我只是厌倦了搜索...请帮助!
先感谢您!
托尼
解决方案
你不应该明确地构造活动(或服务,或广播接收器)。Android 系统在内部执行此操作。构造活动的正确方法是通过带有意图的 startActivity() ;随时为该意图添加额外的参数。
推荐阅读
- apache-spark - Hadoop - Elasticsearch - Spark 版本兼容性
- java - Java - 使用 ECDSA(椭圆曲线)创建 XML 数字签名
- java - Java Graphics2d:如何使用 int 值平滑旋转十二边形
- javascript - 处理ajax post请求时节点js-req.body为空或未定义
- html - 网页设计中 SVG 的 100% 宽度
- qpid - 将 PLAIN 添加到 Apache Qpid Broker-J 的接受 SASL 机制列表中
- python-2.7 - python boto脚本中EC2实例的DiskSpaceUtilization指标显示空响应
- javascript - 另一个组件中的提交按钮创建辅助功能问题
- java - Java ZipFileSystem 在遍历时不保留物理顺序
- android - INSTALL_FAILED_INVALID_APK 次数过多