简体   繁体   English

使用AlarmManager在BroadcastReceiver中运行IntentService

[英]Running an IntentService in BroadcastReceiver using AlarmManager

I want to call a Service in my Receiver class which extends BroadcastReceiver but the service didn't start and I got this error: 我想在我的Receiver类中调用Service ,该类扩展了BroadcastReceiver但该服务未启动,并且出现此错误:

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: 在MainActivity中,我致电警报管理器:

 // 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 : 在我的Receiver类中,我仅调用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: 这是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 . 您尚未为参数c分配context So you are trying to start service on null reference. 因此,您尝试在null引用上启动服务。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM