IntentService
来源:互联网 发布:笨办法学python 26 编辑:程序博客网 时间:2024/06/10 05:26
在项目中也许你要用到在service中启动一个线程去处理一个耗时的操作,然后还得考虑什么时候关闭掉service。挺麻烦的。
android给我们提供了一个IntentService,好使多了。它是service的子类,专门处理异步请求的,而且不用你考虑什么时候关闭servie(stopService()或者stopSelf())。
具体上代码吧:
package com.example.ssl;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import android.app.IntentService;
import android.content.Intent;
import android.util.Log;
/**
* @author zhuojianhai
* IntentService是Service类的子类,用来处理异步请求。
* 客户端可以通过startService(Intent)方法传递请求给IntentService。
* IntentService在onCreate()函数中通过HandlerThread单独开启一个线程来处理所有Intent请求对象
* (通过startService的方式发送过来的)所对应的任务,这样以免事务处理阻塞主线程。
* 执行完所一个Intent请求对象所对应的工作之后,如果没有新的Intent请求达到,则自动停止Service;
* 否则执行下一个Intent请求所对应的任务。
* IntentService在处理事务时,还是采用的Handler方式,创建一个名叫ServiceHandler的内部Handler,并把它直接绑定到HandlerThread所对应的子线程。
* ServiceHandler把处理一个intent所对应的事务都封装到叫做onHandleIntent的虚函数;
* 因此我们直接实现虚函数onHandleIntent,再在里面根据Intent的不同进行不同的事务处理就可以了。
* 另外,IntentService默认实现了Onbind()方法,返回值为null。
* 使用IntentService需要两个步骤:
* 1、写构造函数
* 2、实现虚函数onHandleIntent,并在里面根据Intent的不同进行不同的事务处理就可以了。
* 好处:处理异步请求的时候可以减少写代码的工作量,比较轻松地实现项目的需求
* 注意:IntentService的构造函数一定是参数为空的构造函数,然后再在其中调用super("name")这种形式的构造函数。
* 因为Service的实例化是系统来完成的,而且系统是用参数为空的构造函数来实例化Service的
*
*/
public class MyIntentServiceextends IntentService {
private String TAG = this.getClass().getName();
public MyIntentService() {
super("com.example.ssl.MyIntentService");
Log.i(TAG,TAG+"is constructed");
}
/**
* 这里是请求百度的首页,
* 请求得到数据后,通过log打印出来
*/
@Override
protected void onHandleIntent(Intent intent) {
Log.i(TAG,"the onHandleIntent() is start now");
try {
URL url = new URL("http://www.baidu.com/");
HttpURLConnection urlCon = (HttpURLConnection) url.openConnection();
urlCon.setDoOutput(true);
urlCon.setDoInput(true);
urlCon.setRequestMethod("POST");
urlCon.setRequestProperty("Content-type","text/xml;charset=GB2312");
InputStream is = urlCon.getInputStream();
InputStreamReader inReader = new InputStreamReader(is, "UTF-8");
BufferedReader aReader = new BufferedReader(inReader);
String aLine = null;
StringBuilder sbBuilder = new StringBuilder();
while ((aLine = aReader.readLine()) !=null){
sbBuilder.append(aLine+"\n");
}
inReader.close();
aReader.close();
urlCon.disconnect();
Log.i(TAG, sbBuilder.toString());
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
Log.i(TAG,"the onHandleIntent() is end now");
}
/**
* 执行完所一个Intent请求对象所对应的工作之后,如果没有新的Intent请求达到,则自动停止Service
*/
@Override
public void onDestroy() {
super.onDestroy();
Log.i(TAG,"the onDestory() is invoked");
}
}
还有一个Activity很简单就加在一个有textView的布局文件,并给这个textview加载事件监听,点击textview,就启动service,也就能再log看到请求百度打印出来的数据package com.example.ssl;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
public class TestMyIntenteServiceActivityextends Activity {
TextView text_view;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main1);
text_view = (TextView)findViewById(R.id.text_view);
text_view.setOnClickListener(new OnClickListener() {
@Override
publicvoid onClick(View v) {
//TODO Auto-generated method stub
Intent intent =new Intent(TestMyIntenteServiceActivity.this, MyIntentService.class);
startService(intent);
}
});
}
}
布局文件:<LinearLayoutxmlns: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"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/hello_world"
android:id="@+id/text_view"
/>
</LinearLayout>
在manifest.xml文件注册如下:
<?xmlversion="1.0"encoding="utf-8"?>
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.ssl"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18"/>
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permissionandroid:name="android.permission.MANAGE_ACCOUNTS"/>
<uses-permissionandroid:name="android.permission.CHANGE_CONFIGURATION"/>
<uses-permissionandroid:name="android.permission.INTERNET"/>
<uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permissionandroid:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
<uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/>
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permissionandroid:name="android.permission.GET_ACCOUNTS"/>
<uses-permissionandroid:name="android.permission.CAMERA"/>
<uses-permissionandroid:name="android.permission.WAKE_LOCK"/>
<uses-permissionandroid:name="android.permission.GET_TASKS"/>
<uses-permissionandroid:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION"/>
<!-- 获取手机信息 -->
<uses-permissionandroid:name="android.permission.BROADCAST_STICKY"/>
<uses-permissionandroid:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permissionandroid:name="android.permission.WRITE_SETTINGS">
</uses-permission>
<uses-permissionandroid:name="android.permission.CALL_PHONE">
</uses-permission>
<uses-permissionandroid:name="android.permission.ACCESS_MOCK_LOCATION">
</uses-permission>
<uses-permissionandroid:name="android.permission.ACCESS_GPS"/>
<!-- 蓝牙 -->
<uses-permissionandroid:name="android.permission.BLUETOOTH"/>
<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN"/>
<!-- 震动 -->
<uses-permissionandroid:name="android.permission.VIBRATE"/>
<uses-permissionandroid:name="com.android.permission.RECV_PAIM.com.paic.yl.health"/>
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity
android:name="com.example.ssl.TestMyIntenteServiceActivity"
android:label="@string/app_name">
<intent-filter>
<actionandroid:name="android.intent.action.MAIN"/>
<categoryandroid:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<serviceandroid:name=".MyIntentService"></service>
</application>
</manifest>
点击textview 运行如图
- IntentService
- IntentService
- intentservice
- IntentService
- IntentService
- IntentService
- IntentService
- IntentService
- IntentService
- IntentService
- IntentService
- IntentService
- IntentService
- IntentService
- IntentService
- IntentService
- IntentService
- intentservice
- 最流行的4个机器学习数据集
- Hibernate/JPA中的继承映射 实体extends的关系(每个子类独立一个表)
- C语言中更新文件
- 统计相关系数(2)——Spearman Rank(斯皮尔曼等级)相关系数
- HBase简介
- IntentService
- can not be represented as java.sql.Timestamp
- 内核调试学习笔记
- STUN和TURN技术浅析
- Openwrt上LAMP(Php、Mysql、Apache)的安装配置
- VisionMobile:非对称商务模式(四)非对称商务模式的机制
- hdu 1042
- PRKR-1001 PRK0-2005
- linux 登陆工具