我在我创建的服务中有一个方法,我想从实现进度对话框的Activity访问此方法。这个方法只是更新我的数据库,并且它返回了一个ANR问题,所以我创建了一个Thread,在这个线程中我想调用我服务中的这个方法。我尝试实例化服务,但对象为空
那么,如何在我可以访问此方法的活动中创建一个“对象”。有人可以帮我解决这个问题吗?
感谢。
代码:
public class UpdateDBProgressDialog extends Activity {
private String LOG_TAG = "UpdateDBProgressDialog";
private TextView tv;
private ProgressDialog pd;
private Handler handler;
private RatedCallsService rcs;
private Intent intent;
public boolean mIsBound = false;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
pd = ProgressDialog.show(this, "Updating Database", "The application is updating the database. Please wait.", true, false);
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
pd.dismiss();
}
};
Thread thread = new Thread(){
public void run() {
try{
rcs.updateDB();// Here I'm trying to call the method that is from the service class. But it says 'rcs' is null.
handler.sendEmptyMessage(0);
}catch(Exception e){e.printStackTrace();}
}
};
thread.start();
new Thread(){
public void run(){
try{
Thread.sleep(10000);
if(!RatedCallsService.RUNNING){
Intent i = new Intent(UpdateDBProgressDialog.this, RatedCallsService.class);
UpdateDBProgressDialog.this.startService(i);
}
}catch(Exception e){e.printStackTrace();}
}}.start();
}
}
我只想要一个服务对象,这样我就可以调用我在那里创建的方法。
答案 0 :(得分:2)
当您启动或绑定服务时,其 onCreate 方法调用以及每当您再次启动/绑定时,其 onStartCommand 方法将会调用。因为已经创建了服务。
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
String action = intent.getAction();
if (action.equals(ACTION_PLAY)) // where ACTION_PLAY="any.unique.name.play"
processPlayRequest();
else if (action.equals(ACTION_PAUSE)) // where ACTION_PAUSE="any.unique.name.pause"
processPauseRequest();
else if (action.equals(ACTION_SKIP))
processSkipRequest();
else if (action.equals(ACTION_STOP))
processStopRequest();
else if (action.equals(ACTION_REWIND))
processRewindRequest();
else if (action.equals(ACTION_URL))
processAddRequest(intent);
return START_NOT_STICKY; // Means we started the service, but don't want
// it to
// restart in case it's killed.
}
并称之为:
Intent serviceIntent = new Intent(this, ServiceToStart.class);
serviceIntent.setAction("any.unique.name.play"); // onClick of play button
startService(serviceIntent);
答案 1 :(得分:0)
如果要从Activity调用服务上的操作,有两个选项。一种是在Intent上创建一个Intent,将任何数据集作为extras,然后像在代码中一样启动Service类。然后在Service的onStartCommand中,拉出附加内容并在您的服务上调用适当的方法。对于此选项,您可能希望使用IntentService。另一种选择是绑定到服务并直接调用它上面的方法。为此,您需要使用AIDL声明服务的操作。有关详细信息,请参阅API documentation on Service。