我是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);
....
}
}
答案 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();
}
希望它有所帮助。