IntentService

在项目中也许你要用到在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 运行如图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值