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; } };