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 运行如图

0 0