在运行使用AlarmManager广播接收器的IntentService [英] Running an IntentService in BroadcastReceiver using AlarmManager
问题描述
我想在一个延伸我的接收
类来调用服务
广播接收器
,但服务没有启动,我得到这个错误:
致命异常:主要了java.lang.RuntimeException:无法
开始接收com.example.ahmed.service.AlarmReceiver:
显示java.lang.NullPointerException:试图调用虚拟
法java.lang.String中
android.content.Context.getPackageName()在空
对象引用
在我MainActivity,我拨打了报警管理器:
为AlarmReceiver //日历设置
日历cur_cal =新的GregorianCalendar();
cur_cal.setTimeInMillis(System.currentTimeMillis的()); //设置该日历的当前时间和日期
日历CAL =新的GregorianCalendar();
cal.add(Calendar.DAY_OF_YEAR,cur_cal.get(Calendar.DAY_OF_YEAR));
cal.set(Calendar.HOUR_OF_DAY,8);
cal.set(Calendar.MINUTE,07);
cal.set(Calendar.SECOND,cur_cal.get(Calendar.SECOND));
cal.set(Calendar.MILLISECOND,cur_cal.get(Calendar.MILLISECOND));
cal.set(Calendar.DATE,cur_cal.get(Calendar.DATE));
cal.set(的Calendar.MONTH,cur_cal.get(的Calendar.MONTH)); //检索将执行广播一的PendingIntent
alarmIntent =新意图(这一点,AlarmReceiver.class);
的PendingIntent = PendingIntent.getBroadcast(在此,0,alarmIntent,0); AlarmManager报警=(AlarmManager)getSystemService(Context.ALARM_SERVICE);
alarm.setRepeating(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(),30 * 1000,的PendingIntent);
//当您单击开始按钮,感应
公共无效onSensingButtonClickedToStart(最终查看视图){
如果(!SensorEvent.isSensing){
SensorEvent.isSensing = TRUE; 经理=(AlarmManager)getSystemService(Context.ALARM_SERVICE);
INT间隔= 10000;
manager.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis的(),间隔的PendingIntent);
Toast.makeText(这一点,感觉上,Toast.LENGTH_SHORT).show();
}
} //当你点击停止按钮传感
公共无效onSensingButtonClickedToStop(最终查看视图){
如果(SensorEvent.isSensing){ 经理=(AlarmManager)getSystemService(Context.ALARM_SERVICE);
manager.cancel(的PendingIntent);
Toast.makeText(这一点,感觉关,Toast.LENGTH_SHORT).show();
SensorEvent.isSensing = FALSE;
}
}
我的服务
公共类Sense8扩展IntentService { 公共静态加速度计加速度计;
公共静态陀螺陀螺仪;
公共静态光灯;
公共静态磁磁强计;
上下文语境; / **
*创建一个IntentService。你的子类的构造函数调用。
*
* /
公共Sense8(字符串名称){
超(名);
} 公共Sense8(){
超级(Sense8);
} @覆盖
保护无效onHandleIntent(意向意图){ Log.d(accelerometer.isSensing,SensorEvent.isSensing +);
如果(accelerometer.isSensing){
加速度=新加速计(背景);
陀螺仪=新的陀螺仪(背景);
光=新灯(背景);
磁力=新的磁力仪(背景);
Toast.makeText(背景下,我跑,而不是一些传感器被俘虏,Toast.LENGTH_SHORT).show();
Log.d(敬酒,我跑,而不是被拍摄的某些传感器);
startSensing();
}
} 公共静态无效startSensing(){
accelerometer.start();
gyroscope.start();
light.start();
magnetometer.start();
} 公共无效stopSensing(){
accelerometer.stop();
gyroscope.stop();
light.stop();
magnetometer.stop(); }
}
在我的接收器类中,我只叫 IntentService
:
@覆盖
公共无效的onReceive(上下文C,意图意图){
意向书的服务=新意图(C,Sense8.class);
c.startService(服务);
}
但徒劳的,它甚至不启动,并直接与上述错误打我
我是什么做错了吗?有人能帮助我实现这个正确的方式。
修改
的家伙给了我第一个问题的解决方案,但现在我推传感按钮后,得到了同样的错误。
下面是SensorEvent:
公共类SensorEvent实现SensorEventListener { 公共静态布尔isSensing;
的SensorManager mSensorManager;
传感器mSensor;
DataWriter FileWriter的;
Constants.SensorType sensorType;
上下文语境;
私人SensorEvent()
{} 私有静态SensorEvent INSTANCE = NULL; 公共静态SensorEvent的getInstance()
{
如果(INSTANCE == NULL)
{INSTANCE =新SensorEvent();
}
返回实例;
} 公共静态SensorEvent的getInstance(上下文的背景下,Constants.SensorType sensorType)
{
如果(INSTANCE == NULL)
{INSTANCE =新SensorEvent(背景下,sensorType);
}
返回实例;
}
公共SensorEvent(上下文的背景下,Constants.SensorType sensorType){
this.sensorType = sensorType; this.context =背景;
this.mSensorManager =(的SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
this.mSensor = mSensorManager.getDefaultSensor(sensorType.getType());
// this.isSensing = TRUE;
}
公共无效的start(){
isSensing = TRUE;
FileWriter的=新DataWriter(sensorType);
mSensorManager.registerListener(这一点,mSensor,SensorManager.SENSOR_DELAY_NORMAL);
} 公共无效停止(){
尝试{
fileWriter.finish();
}赶上(IOException异常五){
e.printStackTrace();
}
isSensing = FALSE;
}
@覆盖
公共无效onSensorChanged(android.hardware.SensorEvent事件){ 尝试{
如果(isSensing){
fileWriter.append(事件); }其他{
fileWriter.finish();
mSensorManager.unregisterListener(本);
}
}赶上(例外五){
e.printStackTrace();
}
} @覆盖
公共无效onAccuracyChanged(传感器传感器,精度INT){ }
}
只是改变:
@覆盖
公共无效的onReceive(上下文C,意图意图){
意向书的服务=新意图(背景下,Sense8.class);
context.startService(服务);
}
到
@覆盖
公共无效的onReceive(上下文C,意图意图){
意向书的服务=新意图(C,Sense8.class);
c.startService(服务);
}
您还没有为您分配了背景
来参数 C
。所以,你试图在空引用启动服务。
I want to call a Service
in my Receiver
class which extends BroadcastReceiver
but the service didn't start and I got this error:
FATAL EXCEPTION: main java.lang.RuntimeException: Unable to
start receiver com.example.ahmed.service.AlarmReceiver:
java.lang.NullPointerException: Attempt to invoke virtual
method 'java.lang.String
android.content.Context.getPackageName()' on a null
object reference
In my MainActivity, I call the alarm manager:
// Calendar settings for AlarmReceiver
Calendar cur_cal = new GregorianCalendar();
cur_cal.setTimeInMillis(System.currentTimeMillis());//set the current time and date for this calendar
Calendar cal = new GregorianCalendar();
cal.add(Calendar.DAY_OF_YEAR, cur_cal.get(Calendar.DAY_OF_YEAR));
cal.set(Calendar.HOUR_OF_DAY, 8);
cal.set(Calendar.MINUTE, 07);
cal.set(Calendar.SECOND, cur_cal.get(Calendar.SECOND));
cal.set(Calendar.MILLISECOND, cur_cal.get(Calendar.MILLISECOND));
cal.set(Calendar.DATE, cur_cal.get(Calendar.DATE));
cal.set(Calendar.MONTH, cur_cal.get(Calendar.MONTH));
// Retrieve a PendingIntent that will perform a broadcast
alarmIntent = new Intent(this, AlarmReceiver.class);
pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, 0);
AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 30 * 1000, pendingIntent);
// When you click Start sensing button
public void onSensingButtonClickedToStart(final View view) {
if (!SensorEvent.isSensing) {
SensorEvent.isSensing = true;
manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
int interval = 10000;
manager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent);
Toast.makeText(this, "Sensing On", Toast.LENGTH_SHORT).show();
}
}
// when you click Stop sensing button
public void onSensingButtonClickedToStop(final View view) {
if (SensorEvent.isSensing) {
manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
manager.cancel(pendingIntent);
Toast.makeText(this, "Sensing Off", Toast.LENGTH_SHORT).show();
SensorEvent.isSensing = false;
}
}
My Service
public class Sense8 extends IntentService {
public static Accelerometer accelerometer;
public static Gyroscope gyroscope;
public static Light light;
public static Magnetometer magnetometer;
Context context;
/**
* Creates an IntentService. Invoked by your subclass's constructor.
*
*/
public Sense8(String name) {
super(name);
}
public Sense8(){
super("Sense8");
}
@Override
protected void onHandleIntent(Intent intent) {
Log.d("accelerometer.isSensing", SensorEvent.isSensing + "");
if (accelerometer.isSensing) {
accelerometer = new Accelerometer(context);
gyroscope = new Gyroscope(context);
light = new Light(context);
magnetometer = new Magnetometer(context);
Toast.makeText(context, "I'm running instead of some sensors being captured", Toast.LENGTH_SHORT).show();
Log.d("toast", "I'm running instead of some sensors being captured");
startSensing();
}
}
public static void startSensing() {
accelerometer.start();
gyroscope.start();
light.start();
magnetometer.start();
}
public void stopSensing() {
accelerometer.stop();
gyroscope.stop();
light.stop();
magnetometer.stop();
}
}
In my Receiver class, I only call the IntentService
:
@Override
public void onReceive(Context c, Intent intent) {
Intent service = new Intent(c, Sense8.class);
c.startService(service);
}
But in vain, it doesn't even start and hit me directly with the above error
What am I doing wrong? Can someone help me implement this the right way.
EDIT
the guys gave me the right solution for the first problem but now I get the same error after pushing the sensing button
Here is the SensorEvent:
public class SensorEvent implements SensorEventListener {
public static boolean isSensing;
SensorManager mSensorManager;
Sensor mSensor;
DataWriter fileWriter;
Constants.SensorType sensorType;
Context context;
private SensorEvent()
{}
private static SensorEvent INSTANCE = null;
public static SensorEvent getInstance()
{
if (INSTANCE == null)
{ INSTANCE = new SensorEvent();
}
return INSTANCE;
}
public static SensorEvent getInstance(Context context, Constants.SensorType sensorType)
{
if (INSTANCE == null)
{ INSTANCE = new SensorEvent(context, sensorType);
}
return INSTANCE;
}
public SensorEvent(Context context, Constants.SensorType sensorType) {
this.sensorType = sensorType;
this.context = context;
this.mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
this.mSensor = mSensorManager.getDefaultSensor(sensorType.getType());
// this.isSensing = true;
}
public void start() {
isSensing = true;
fileWriter = new DataWriter(sensorType);
mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL);
}
public void stop() {
try {
fileWriter.finish();
} catch (IOException e) {
e.printStackTrace();
}
isSensing = false;
}
@Override
public void onSensorChanged(android.hardware.SensorEvent event) {
try {
if (isSensing) {
fileWriter.append(event);
} else {
fileWriter.finish();
mSensorManager.unregisterListener(this);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
just change :
@Override
public void onReceive(Context c, Intent intent) {
Intent service = new Intent(context, Sense8.class);
context.startService(service);
}
to
@Override
public void onReceive(Context c, Intent intent) {
Intent service = new Intent(c, Sense8.class);
c.startService(service);
}
You haven't assigned you context
to parameter c
. So you are trying to start service on null reference.
这篇关于在运行使用AlarmManager广播接收器的IntentService的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!