Activity与Service的交互相关的面试题及答案
时间: 2024-03-11 10:48:27 浏览: 17
以下是Activity与Service的交互相关的面试题及答案:
1. Activity如何启动Service?
答:Activity可以通过调用`startService()`方法来启动Service。例如:
```java
Intent intent = new Intent(this, MyService.class);
startService(intent);
```
2. Service如何与Activity进行通信?
答:Service可以通过Binder机制与Activity进行通信。以下是一些实现方式:
- Service中定义Binder
```java
public class MyService extends Service {
private final IBinder mBinder = new MyBinder();
public class MyBinder extends Binder {
public MyService getService() {
return MyService.this;
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
public int getRandomNumber() {
return new Random().nextInt(100);
}
}
```
- Activity中绑定Service,并获取Service实例
```java
private MyService mService;
private boolean mBound = false;
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
MyService.MyBinder binder = (MyService.MyBinder) service;
mService = binder.getService();
mBound = true;
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
mBound = false;
}
};
@Override
protected void onStart() {
super.onStart();
Intent intent = new Intent(this, MyService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onStop() {
super.onStop();
if (mBound) {
unbindService(mConnection);
mBound = false;
}
}
public void onClick(View view) {
if (mBound) {
int num = mService.getRandomNumber();
Toast.makeText(this, "number: " + num, Toast.LENGTH_SHORT).show();
}
}
```
3. Service如何在后台执行任务并向Activity发送结果?
答:Service可以通过Handler机制向Activity发送结果。以下是一个例子:
- Service中定义Handler
```java
public class MyService extends Service {
private Looper mServiceLooper;
private ServiceHandler mServiceHandler;
private final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
// 执行任务
int result = doWork();
// 发送结果
Message message = mHandler.obtainMessage();
message.arg1 = result;
mHandler.sendMessage(message);
}
}
@Override
public void onCreate() {
super.onCreate();
HandlerThread thread = new HandlerThread("ServiceStartArguments", Process.THREAD_PRIORITY_BACKGROUND);
thread.start();
// 获取Handler的Looper
mServiceLooper = thread.getLooper();
// 创建ServiceHandler
mServiceHandler = new ServiceHandler(mServiceLooper);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Message message = mServiceHandler.obtainMessage();
message.arg1 = startId;
mServiceHandler.sendMessage(message);
// Service执行完任务后自动停止
return START_NOT_STICKY;
}
private int doWork() {
// 执行任务
return new Random().nextInt(100);
}
// Activity中定义Handler
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
Toast.makeText(getApplicationContext(), "Result: " + msg.arg1, Toast.LENGTH_SHORT).show();
}
};
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
```
- Activity中调用Service
```java
Intent intent = new Intent(this, MyService.class);
startService(intent);
```
通过以上的例子可以看出,Service可以在后台执行任务,并通过Handler机制将结果发送给Activity。