Activity,Service和AsyncTask接口

时间:2014-03-04 03:04:46

标签: android

我有一个android.support.v4.app.FragmentActivity(MyActivity)的子类,android.app.Service的一个子类和android.os.AsyncTask的一个子类(MyAsyncTask)。

示例代码:

MyActivity.java

onCreate(...) { // start MyService }

MyService.java

onStartCommand(...){ // execute MyAsyncTask }

MyAsyncTask.java

onPostExecute(String result) { // send result to MyActivity};

我的问题是,如果成功MyAsyncTask,我如何将结果从MyActivity发送。

6 个答案:

答案 0 :(得分:0)

一种方法是将您的活动绑定到您的服务,以便他们可以共享一个公共通信渠道。

答案 1 :(得分:0)

这在一个简短的段落中不容易回答。但基本上你想要做的就是使用绑定作为你的服务。

这当然不是一项微不足道的任务,但它是优雅的方式。除了使用startService()启动服务外,您还可以绑定到您的服务。绑定机制允许您的Activity具有指向Service类的指针。使用此指针,您可以执行任何操作,包括将Activity本身的指针传递给Service,这样服务就会有一个指向Activity的指针。

一旦Service有一个指向Activity的指针,你可以调用任何方法并设置你想要的任何变量,包括设置AsyncTask的返回值。

答案 2 :(得分:0)

您可以使用MyActivity制作SingleInstance模型。

class MyActivity extends Activity{
  private static MyActivity instance;
  public static MyActivity getInstance(){
      return instance;
  }
  public void onCreate(Bundle savedInstanceState) {
      instance = this;
      //xxx

  }

  public void onDestroy() {
       instance = null;
     ///
  }

  public void doSomething(){}
}

然后你可以在onPostExecute中调用MyActivity.getInstance()。doSomething();

答案 3 :(得分:0)

一些替代方案:

  • 使用IntentService,它基本上是处理异步请求的Service

  • AsyncTask的{​​{1}}发送广播并在您onPostExecute(简单示例here

  • 中接收广播

答案 4 :(得分:0)

我已经尝试过这个结构,它可以在我的应用上运行。希望它有所帮助。 创建使用异步任务和单例扩展的服务类..

 <service android:name=".myService" />

服务类

public class myService extends AsyncTask<String,String,String> 
{
    private Activity active  = null;
    protected myService () {}

     public static myService getInstance(Activity activity) {
      myService  myTask = new myService ();
      myTask.active = activity;
      return myTask;
     }

   public startTask()  {
     //start the async task.. 
     this.execute(new String[] {});
   }

  protected void onPostExecute(String result) { 

    //check result sucess cond and call
    active.updateActivity(result)

    }
  }

活动类

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
         myService.getInstance(this).startTask();
    }

  public void updateActivity(result){
     //do something on activity with result...
  }

答案 5 :(得分:0)

您可以通过“广播”将服务(MyAsyncTask.java和MyService.java)类的结果发送到activity(myactivity)类

这是一个例子

在你的onPostExecute(String result)方法中添加:

Intent intent = new Intent("your  activity class[myactivity.java]");
intent.putExtra("RESULT", result)
sendBroadcast(intent);

和你的我的活动课 像这样接收发送广播:

private BroadcastReceiver receiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        String bundle = intent.getStrings();// get resulting string and do whatever you want.
    }  

}  

不要忘记在myactivity类中注册和取消注册广播,例如:

@Override
protected void onResume() {
    super.onResume();
    registerReceiver(receiver, new IntentFilter("your service class"));
}     

@Override
protected void onPause() {
    super.onPause();
    unregisterReceiver(receiver);
}