如何访问'活动'从服务类通过Intent?

时间:2014-03-21 00:51:31

标签: android android-intent android-activity


我是Android编程的新手 - 所以我对“上下文”并没有非常清楚的理解。和意图'。
我想知道有没有办法从服务类访问活动?  也就是说,我说我有2个班级 - 一个来自"活动"和其他来自" Service"我在Activity类中创建了一个intent来启动服务。

或者,如何访问'服务'来自我的'活动' class - 因为在这样的工作流中,Service类不是由我的Activity-code直接实例化的。

public class MainActivity extends Activity {
       .       
       .
    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);

       startService(new Intent(this, CommunicationService.class));
       .
       .    
}


public class CommunicationService extends Service implements ..... {
    .
    .
    @Override
    public int onStartCommand(final Intent intent, int flags, final int startId) {
        super.onStartCommand(intent, flags, startId);
        ....
    }

}

1 个答案:

答案 0 :(得分:4)

您可以使用bindService(Intent intent, ServiceConnection conn, int flags)代替startService来启动服务。而conn将是一个内部类,如:

private ServiceConnection conn = new ServiceConnection() {

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        mMyService = ((CommunicationService.MyBinder) service).getService();
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {

    }
};

mMyService是您CommunicationService的实例。

CommunicationService中,只需覆盖:

public IBinder onBind(Intent intent) {
    return new MyBinder();
}

以及CommunicationService中的以下课程:

public class MyBinder extends Binder {
    public CommunicationService getService() {
        return CommunicationService.this;
    }
}

因此,您可以使用mMyService访问活动中的所有公共方法和字段。

此外,您还可以使用回调界面访问服务中的活动。

首先编写一个界面,如:

public interface OnChangeListener {
    public void onChanged(int progress);
}

在您的服务中,请添加公开方法:

public void setOnChangeListener(OnChangeListener onChangeListener) {
    this.mOnChangeListener = onChangeListener;
}

您可以在任何地方使用服务中的onChanged,以及您活动中的工具:

    public void onServiceConnected(ComponentName name, IBinder service) {
        mMyService = ((CommunicationService.MyBinder) service).getService();
        mMyService.setOnChangeListener(new OnChangeListener() {
            @Override
            public void onChanged(int progress) {
                // anything you want to do, for example update the progressBar
                // mProgressBar.setProgress(progress);
            }
        });
    }

ps:bindService将是这样的:

this.bindService(intent, conn, Context.BIND_AUTO_CREATE);

并且不要忘记

protected void onDestroy() {
    this.unbindService(conn);
    super.onDestroy();
}

希望它有所帮助。