IntentService的使用介绍
2016-04-29 11:10
225 查看
IntentService简介
一,IntentService是Service的子类,比普通的Service增加了额外的功能。先看Service本身存在两个问题:Service不会专门启动一条单独的进程,Service与它所在应用位于同一个进程中;
Service也不是专门一条新线程,因此不应该在Service中直接处理耗时的任务;
二、IntentService特征
会创建独立的worker线程来处理所有的Intent请求;
会创建独立的worker线程来处理onHandleIntent()方法实现的代码,无需处理多线程问题;
所有请求处理完成后,IntentService会自动停止,无需调用stopSelf()方法停止Service;
为Service的onBind()提供默认实现,返回null;
为Service的onStartCommand提供默认实现,将请求Intent添加到队列中;
布局文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.intentservice.MainActivity" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="17dp" android:text="意图服务" android:textSize="30dp" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textView1" android:layout_centerHorizontal="true" android:onClick="upload" android:layout_marginTop="38dp" android:text="上传" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/button1" android:layout_centerVertical="true" android:text="下载" android:onClick="download" /> </RelativeLayout>
activity的代码
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } // 上传 public void upload(View v) { Intent intent=new Intent(this, FileService.class); intent.putExtra("cmd", 1); startService(intent); } public void download(View v){ Intent intent=new Intent(this, FileService.class); intent.putExtra("cmd", 2); startService(intent); } }
再来是重点 FileService的代码
public class FileService extends IntentService { public FileService() { // name是改service的一个标记,一般不用 系统内部调用会有一个映射 super("myFileService"); }// 又不要返回 就是标记的作用 @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); System.out.println("oncreate"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { // TODO Auto-generated method stub System.out.println("onstartCommant"); return super.onStartCommand(intent, flags, startId); } @Override protected void onHandleIntent(Intent intent) { // 在子线程运行,耗时操作 System.out.println("onHandleIntent"); int cmd = intent.getIntExtra("cmd", 0); switch (cmd) { case 1: System.out.println("onHandleIntent+上传"); Toast.makeText(getApplicationContext(), "上传", Toast.LENGTH_SHORT).show(); SystemClock.sleep(2000); break; case 2: System.out.println("onHandleIntent+下载"); Toast.makeText(getApplicationContext(), "下载", Toast.LENGTH_SHORT).show(); break; default: break; } } @Override public void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); System.out.println("onDestory"); } // spring :strus javabena 系统调用空的构造方法 }
专启一个线程来处理耗时操作,而普通service却不会。
有两点需要注意
1。toast 并有显示
2。SystemClock.sleep(2000);睡眠两秒是为了每批次的请求队列不被销毁!
相关文章推荐
- leetcode 89. Gray Code
- Intel SGX Application
- FLV文件格式官方规范详解
- 垂直应用架构
- Android蓝牙通信开发总结
- 斌哥的 Docker 进阶指南
- CSS 语法
- mysql-5.7.12-winx64安装版配置、使用
- Permutation Sequence
- 20140429java.lang.NoSuchMethodError com.sun.mail.util.TraceInputStream
- POJ-3744 Scout YYF I (概率DP&&矩阵快速幂)
- MFC如何由继承于CView类修改为继承于CFormView类
- 大数减法
- CSS字体
- 1.微信公众号---获取关注用户
- 获取用户 ip
- MVVM模式下如何使用ReactiveCocoa响应链式编程<一>
- 递归打印级联目录
- android存储空间的分类
- SQL查询优化技巧