从Activity访问我自己的Service方法

时间:2011-06-16 00:03:42

标签: android broadcastreceiver android-service

我在我创建的服务中有一个方法,我想从实现进度对话框的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();
    }
}

我只想要一个服务对象,这样我就可以调用我在那里创建的方法。

2 个答案:

答案 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