Service 比 Activity 具备更高的优先级
Service 的应用形式
- 启动形式
- 绑定形式
应用通过服务链接(Connction)实现
应用 Service 的组件通过 Context.bindService() 建设连贯,通过 Context.unbindService()断开连接
如何实现 Service()?
public class RandomService extends Service{
@Override
public void onCreate() {super.onCreate();
// 实现代码
}
@Override
public void onStart(Intent intent, int startId) {super.onStart(intent, startId);
// 实现代码
}
@Override
public void onDestroy() {super.onDestroy();
// 实现代码
}
@Override
public IBinder onBind(Intent intent) {return null;}
}
Service 被绑定后调用的函数,可能返回 Service 的对象实例:
public IBinder onBind(Intent intent){return Service 的对象实例}
Service 的对象实例怎么写?
实现 Service 类须要在 AndroidManifest.xml 注册服务
<service android:name=".RandomService"/>
在其余组件启动服务
显示启动
final Intent serviceIntent = new Intent(this, RandomService.class);
startService(serviceIntent);
stopService(serviceIntent);
隐式启动
final Intent serviceIntent = new Intent();
serviceIntent.setAction("edu.hrbeu.RandomService");// 传递参数是 Service 的包名地位
除此之外还要在 AndroidManifest.xml 申明,让启动找到相应的服务
<service android:name=".RandomService">
<intent-filter>
<action android:name="edu.hrbeu.RandomService"/>
</intent-filter>
</service>
Activity,Service,BroadcastReceiver 都是工作在主线程
如何创立子线程?
- 实现 java 的 Runnable 接口,重载 run()函数
- 创立 Thread 对象,将 Runnable 对象作为参数传递给 Thread 对象
- 启动线程是 Thread 对象调用 start()办法;
- 如何终止线程?调用 interrupt()办法;
如何应用线程中的数据更新用户界面?
用 Handler 更行用户界面
新建 Handler 实例,通过 post()办法将 Runnable 对象从后盾线程发送到 GUI 线程的音讯队列
private static Handler handler = new Handler();
public static void UpdateGUI(double refreshDouble){
randomDouble = refreshDouble;
handler.post(RefreshLable);
}
private static Runnable RefreshLable = new Runnable(){
@Override
public void run() {labelView.setText(String.valueOf(randomDouble));
}
};
- 如何让一般函数能够变成线程函数?实现接口 Runnable()中对应的 run()办法,函数的实现的办法写在 run()中。
- 启动线程须要创立 Thread 对象,将线程函数作为参数传递给 Thread 对象,通过 Thread 对象操纵线程的启动和暂停
- 将线程中的数据更新到用户界面,就是借助 Handler,先创立一个 Handler 实例,handler()通过 post()办法:handelr.post([线程函数名]),将线程函数作为参数传递过来,这样线程函数就会被退出到 GUI 的线程音讯队列中,期待被执行。
如何绑定服务?
final Intent serviceIntent = new Intent(SimpleMathServiceDemoActivity.this,MathService.class);
bindService(serviceIntent,mConnection,Context.BIND_AUTO_CREATE);
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder binder) {mathService = ((MathService.LocalBinder).binder).getService();}
@Override
public void onServiceDisconnected(ComponentName name) {mathService = null;}
};