在项目中也许你要用到在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 MyIntentService extends 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 TestMyIntenteServiceActivity extends 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
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(TestMyIntenteServiceActivity.this, MyIntentService.class);
startService(intent);
}
});
}
}
布局文件:
<LinearLayout 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"
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文件注册如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns: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-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
<!-- 获取手机信息 -->
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" >
</uses-permission>
<uses-permission android:name="android.permission.CALL_PHONE" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_GPS" />
<!-- 蓝牙 -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<!-- 震动 -->
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="com.android.permission.RECV_PAIM.com.paic.yl.health" />
<uses-permission android: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>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".MyIntentService"></service>
</application>
</manifest>
点击textview 运行如图