您的位置:首页 > 移动开发 > Android开发

android 四大组件之Service(4)IntentService

2016-06-24 19:17 267 查看
IntentService : 自带线程,处理请求,但每次值处理一个线程。主要实现一个方法
          onHandleIntent();
   Service类的子类,它使用了工作(worker)线程来处理所有的启动请求,每次请求都会启动一个线程
如果服务不需要同时处理多个请求的话,这是最佳的选择。 所有你要做的工作就是实现onHandleIntent()
即可,它会接收每个启动请求的intent,然后就可在后台完成工作。
因为大多数started服务都不需要同时处理多个请求(这实际上是一个危险的多线程情况),
所以最佳方式也许就是用IntentService类来实现你的服务。

IntentService将执行以下步骤:
  创建一个缺省的工作(worker)线程,它独立于应用程序主线程来执行所有
发送到onStartCommand()的intent。
  创建一个工作队列,每次向你的onHandleIntent()传入一个intent,
这样你就永远不必担心多线程问题了。
  在处理完所有的启动请求后,终止服务,因此你就永远不需调用stopSelf()了。
  提供缺省的onBind()实现代码,它返回null。
提供缺省的onStartCommand()实现代码,它把intent送入工作队列,
稍后会再传给你的onHandleIntent()实现代码。

以上所有步骤将汇成一个结果:你要做的全部工作就是实现onHandleIntent()的代码,
来完成客户端提交的任务。(当然你还需要为服务提供一小段构造方法。)
第一步创建一个IntentService的子类,实现onHandleIntent() 方法

public class HelloIntentService extends IntentService{
private static final String image_path = "http://pic.xxhh.com/cons/20160513/8ce093d306da08fa.jpg";

public HelloIntentService() {
super("HelloService");
}
/**
* IntentService从缺省的工作线程中调用本方法,并从启动服务的Intent作为参数,
* 本方法返回后,IntentService将适时的终止这个服务。
*/
@Override
protected void onHandleIntent(Intent intent) {
Log.i("tag", "onHandleIntent");
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpPost = new HttpGet(image_path);
try {
HttpResponse response = httpClient.execute(httpPost);

if( response.getStatusLine().getStatusCode() == 200) {
byte[] result = EntityUtils.toByteArray(response.getEntity());
boolean flag = SDKTools.saveToSDK("ab.jpg", result);
if(flag)
Log.i("tag", "下载成功。。。");
} else {
Log.i("tag", "下载失败==>"+response.getStatusLine().getStatusCode());
}
}catch(Exception e) {
e.printStackTrace();
}
}
}

第二步在清单文件中注册服务:
    <service android:name="com.example.intentservicetest.HelloIntentService">


第三部在activity中启动服务,她是继承服务,启动方式一样
public class MainActivity extends Activity {
Button btn1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1 = (Button)findViewById(R.id.button1);
btn1.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, HelloIntentService.class);
startService(intent);
}
});
}

}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: