从广播接收器启动活动和服务

问题描述

| 首先,对不起我的英语。所以我正在制作一个程序,当用户需要时会提醒用户 服用他/她的药物。我的基本想法: 1 AlarmManager向我发送信号 2我用广播接收器捕获到该信号, 3,广播接收器启动我的服务和我的活动。 服务从10分钟开始倒数,每分钟将检查数据库中的其他参数 活动将发出声音并振动。因为会有更多的药物,所以我列出了 纽扣。并且由于服务和活动使用相同的游标,因此该服务与 数据库。因此,当我的Activity启动时,它需要从Service(用于cursoradapter)中获取光标。 而且,如果服务或活动更改了游标,我需要刷新该游标,因此我在服务中进行了重新查询。 唯一的问题是,尽管我的bindService给我真实的结果,但我的onServiceConnected 方法没有运行完,因此当我尝试调用public service方法(对于游标)时,我得到了nullpointer异常 从我的活动中。我尝试在onStartCommand之后从服务启动我的Activity,但结果也是空指针。 完成任务的最佳方法是什么? 我应该从服务中删除我的服务并从活动中创建另一个线程(AsyncTask)吗? 好吧,我试图抓住重要的部分。
package elte.thesis.broadcastreceivers;

import elte.thesis.alarmsmanager.AlarmActivity;
import elte.thesis.alarmsmanager.WakeLockManager;
import elte.thesis.database.Utility;
import android.content.broadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

/*
 * This broadcastReceiver will receive the ALARM from the AlarmManager
 * and it will 
 * 1,start the Service and 
 * 2,show the AlarmActivity 
 */
public class DosageAlarmReceiver extends broadcastReceiver {

@Override
public void onReceive(Context context,Intent intent) {
    Log.v(\"Szakbarbar\",\"AlarmManager send me the next \" + \"alarm time: \" +    intent.getStringExtra(\"AlarmTime\"));

    /*
     * It seems that the alarmmanager release the wakelock as soon as our
     * onReceive method return,so we need to make our own wakelock
     */
    WakeLockManager.acquirecpuWakeLock(context);

    /*
     * Start the service and give him the time what we got from alarm manager
     */
    Log.v(\"Szakbarbar\",\"Elinditjuk a servicunket\");
    Intent serviceIntent = new Intent(Utility.ALARM_SERVICE);
    serviceIntent.putExtra(\"AlarmTime\",intent.getStringExtra(\"AlarmTime\"));
    context.startService(serviceIntent);

    /*
     * Start the AlarmActivity where the user can sign that he got in the
     * pills
     */
    Log.v(\"Szakbarbar\",\"Elinditjuk az activitinket\");
    Intent alarmActivity = new Intent(context,AlarmActivity.class);
    alarmActivity.putExtra(\"AlarmTime\",intent.getStringExtra(\"AlarmTime\"));
    alarmActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_USER_ACTION);
    context.startActivity(alarmActivity);

}

 }
在我的AlarmActivity中
 AlarmService mService;
 ...
@Override
public void onStart() {
    super.onStart();

    Log.v(\"Szakbarbar\",\"Bind to the Service\");
    Intent intent = new Intent(Utility.ALARM_SERVICE);
    boolean connection = bindService(intent,mConnection,Context.BIND_AUTO_CREATE);
    Log.v(\"Szakbarbar\",\"Binded to the Service : \" +      ((connection==true)?\"kapcsolt\":\"nemkapcsolt\"));
}

@Override
public void onResume() {
    super.onResume();

    Log.v(\"Szakbarbar\",\"Need the cursor from the Service\");
    updateDosageAdapter();

    //Make one private register to Now when the AlarmService made change on the cursor
    registerReceiver(mReceiver,new IntentFilter(Utility.ALARMS_CHANGED));

    if (!mute) {
        if (volume < 1)
            incAlarmVolume();
        mVibrator.vibrate(sVibratePattern,0);
        player.start();
    }
}

/** Defines callbacks for service binding,passed to bindService() */
private ServiceConnection mConnection = new ServiceConnection() {

    @Override
    public void onServiceConnected(ComponentName className,IBinder service) {
        // We\'ve bound to LocalService,cast the IBinder and get LocalService instance
        Log.v(\"Szakbarbar\",\"mService itt még nulla\");
        LocalBinder binder = (LocalBinder) service;
        mService = binder.getService();
        mBound = true;
        Log.v(\"Szakbarbar\",\"mService itt már nem nulla\");          
    }

    @Override
    public void onServicedisconnected(ComponentName arg0) {
        mBound = false;
    }
};
public void updateDosageAdapter() {
    Log.v(\"Szakbarbar\",\"1\");
    alarmsCursor = mService.refreshCursor();
    Log.v(\"Szakbarbar\",\"2\");       
    startManagingCursor(alarmsCursor);
    Log.v(\"Szakbarbar\",\"3\");       
    if (alarmsAdapter == null) {
        Log.v(\"Szakbarbar\",\"4\");           
        alarmsAdapter = new AlarmsAdapter(this,alarmsCursor);
        alarmsList = (ListView) findViewById(R.id.dosage_alarm_list);
        alarmsList.setAdapter(alarmsAdapter);
        alarmsList.setVerticalScrollBarEnabled(true);
        alarmsList.setScrollContainer(false);
        alarmsList.setonCreateContextMenuListener(this);
    } else {
        Log.v(\"Where is nullpointerexception\",\"5\");            
        alarmsAdapter.changeCursor(alarmsCursor);
    }
}
而在我的服务
 private final IBinder mBinder = new LocalBinder();
 ...
// Return this instance of AlarmService so clients can call public methods
public class LocalBinder extends Binder {
    AlarmService getService() {
        return AlarmService.this;
    }
}

@Override
public IBinder onBind(Intent intent) {
    return mBinder;
}

//Refresh the cursor
public Cursor refreshCursor() {

    Log.v(\"Szakbarbar\",\"ResreshCrusor : \" + alarmTime);

    alarmCursor = Utility.selectDosageAlarms(alarmTime);        
    return alarmCursor;
}
我的问题的简短描述 我想您还不知道我的问题是什么。我英语不好,很抱歉给您带来麻烦。虽然我在onStart()上调用bindService() 当我调用(也从AlarmActivity)updateDosageAdapter()时使用AlarmActivity的方法,该方法使用我从Service获得的refreshCursor()方法 空指针异常,因为onServiceConnected()方法尚未运行完毕,并且我的mService变量应保持 我的服务参考为空。     

解决方法

我设法找到一个解决方案,如本文所述