Android——服务
2015-11-06 12:15
369 查看
服务默默的在后台工作着,执行着不需要和用户交互的工作。
服务依赖于应用程序进程而存活
作为四大组件之一,服务具备共同的特点——需要在AndroidManifest中注册
通过异步消息处理机制进行UI操作
在主线程定义一个handler
子线程通过handler发送数据
AndroidManifest.xml
服务依赖于应用程序进程而存活
作为四大组件之一,服务具备共同的特点——需要在AndroidManifest中注册
Android多线程编程
需要注意的是——一定不要在子线程中进行UI操作,否则会阻塞主线程出现异常/** 主要的逻辑是在这里完成,但是考虑到:服务默认是在主线程执行的,如果在这里进行比较费时的操作<br/> * 就容易出现ANR(Application Not Responding).<br/> * 所以标准的写法是在这里新建一个子线程执行逻辑处理<br/> * 但是:这样做了之后,必须要使用stopService或stopSelf才能停得下来 */ @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d("test", "service onStartCommand"); new Thread(new Runnable() { @Override public void run() { // 逻辑处理——不能进行UI更新 // ... // 这里处理完之后调用停止服务 stopSelf(); } }).start(); return super.onStartCommand(intent, flags, startId); }
通过异步消息处理机制进行UI操作
在主线程定义一个handler
public static final int SHOW_RESPONSE = 0; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case SHOW_RESPONSE: String response = (String) msg.obj; // 进行UI更新:根据子线程换回来的msg.obj的值和msg.what的值break; default: break; } } };
子线程通过handler发送数据
new Thread(new Runnable() { @Override public void run() {try { // 将获取到的数据交给Handler处理 Message msg = new Message(); msg.what = SHOW_RESPONSE; msg.obj = 对象; handler.sendMessage(msg); } catch (IOException e) { e.printStackTrace(); } finally { } } } }).start();
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.servicebesttest" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name="com.example.servicebesttest.LongRunningService" > </service> <receiver android:name="com.example.servicebesttest.ServiceReceiver" > </receiver> </application> </manifest>
AndroidManifest.xml
相关文章推荐
- Android编程实现横竖屏切换时不销毁当前activity和锁定屏幕的方法
- Android代码规范
- Android MVP结构的初步认识
- Android之Android studio如何解决Multiple dex files define Landroid/support/a(文件重复引用错误)
- Google宣布支持Vulkan作为Android的底层图形API
- Gallery自动循环滚动以及手动滚动的平滑切换
- AndroidSwipeLayout的使用(listview,gridview,view中滑动显示隐藏按钮的使用)
- Android 使用Fragment界面向下跳转并一级级返回
- 吃掉Android混淆——ProGuard第一篇
- Android 使用Fragment实现底部菜单栏
- android 遍历assert文件夹下的文件
- android toolbar
- Android开发之创建ActionBar
- Cannot reload AVD list:
- android中invalidate()的自动清屏含义以及屏幕刷新
- 使用Intent.ACTION_EDIT 调用系统编辑联系人
- Android开发&多媒体控件
- Android Mvvm入门教程
- android中 AIDL的使用
- Android NOTE