在运行使用AlarmManager广播接收器的IntentService [英] Running an IntentService in BroadcastReceiver using AlarmManager

查看:1107
本文介绍了在运行使用AlarmManager广播接收器的IntentService的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在一个延伸我的接收类来调用服务 广播接收器,但服务没有启动,我得到这个错误:

 致命异常:主要了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆