当前位置:首页 » 安卓系统 » androidlocal

androidlocal

发布时间: 2024-07-12 20:26:34

❶ 如何给Android应用创建本地服务

本文通过代码向大家详细介绍和演示这两种的服务的创建过程,代码适用于Android2.3.3以后的版本。


1. 定义清单文件(AndroidManifest.xml)

4. 创建服务启动界面(LocalServiceActivities.java

package my.android.test;

import android.app.Activity;

import android.content.ComponentName;

import android.content.Context;

import android.content.Intent;

import android.content.ServiceConnection;

import android.os.Bundle;

import android.os.IBinder;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.Toast;

/**

* 该类中包含两种类型服务的客户端:

* 启动类型服务客户端:Controller

* 绑定类型服务客户端:Binding

*/

publicclass LocalServiceActivities {

/**

* Controller类是启动类型服务的客户端,它包含两个按钮:

* start:点击该按钮时,启动服务。

* stop: 点击该按钮时,终止服务。

*/

publicstaticclass Controller extends Activity{

/**

* Activity被首次启动时,调用该方法。

*/

@Override

protectedvoid onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

//填充布局

setContentView(R.layout.local_service_controller);

//查找布局中的启动服务按钮,并设置点击事件监听器。

Button button = (Button)findViewById(R.id.start);

button.setOnClickListener(mStartListener);

//查找布局中的终止服务按钮,并设置点击事件监听器。

button = (Button)findViewById(R.id.stop);

button.setOnClickListener(mStopListener);

}

/**

* start按钮的点击事件监听器实现。

*/

private OnClickListener mStartListener = new OnClickListener(){

publicvoid onClick(View v){

//启动LocalService服务。

startService(new Intent(Controller.this, LocalService.class));

}

};

/**

* stop按钮的点击事件监听器实现。

*/

private OnClickListener mStopListener = new OnClickListener(){

publicvoid onClick(View v){

//终止LocalService服务。

stopService(new Intent(Controller.this, LocalService.class));

}

};

}

/***************************************************************

*以下是绑定型服务客户端的实现

***************************************************************/

/**

* Binding类是绑定类型服务的客户端,它包含两个按钮:

* bind:点击该按钮时,调用bindService()方法绑定并启动服务;

* unbind:点击该按钮时,调用unbindService()方法解除绑定并终止服务。

*/

publicstaticclass Binding extends Activity{

//用于保存服务的绑定状态,true:绑定,false:未绑定

privatebooleanmIsBound;

//用于保存被绑定的本地服务实例。

private LocalService mBoundService;

/**

* 实现监视被绑定服务状态的接口:ServiceConnection

* 绑定类型服务都要实现这个接口,以便监视服务的状态,这个接口中的方法会在

* 应用的主线程中被调用。

*/

private ServiceConnection mConnection = new ServiceConnection(){

/**

* 当连接的服务被创建时,Android系统会调用这个方法,用IBinder对象跟服务建立通信通道。

* @param className:被连接的具体的服务组件的名称

* @param service:服务的通信通道IBinder对象。

*/

publicvoid onServiceConnected(ComponentName className, IBinder service){

//从IBinder对象中获取服务实例。

mBoundService = ((LocalService.LocalBinder)service).getService();

//显示Activity已经与服务建立了连接的提示消息。

Toast.makeText(Binding.this, R.string.local_service_connected, Toast.LENGTH_SHORT).show();

}

/**

* 当服务被终止时,Android系统会调用这个方法。

*/

publicvoid onServiceDisconnected(ComponentName className){

//清除客户端服务实例

mBoundService = null;

//显示服务被终止的提示消息。

Toast.makeText(Binding.this, R.string.local_service_disconnected, Toast.LENGTH_SHORT).show();

}

};

/**

* 绑定并启动服务,bind按钮点击时会调用这个方法。

*/

void doBindService(){

//绑定并启动服务。

bindService(new Intent(Binding.this, LocalService.class), mConnection, Context.BIND_AUTO_CREATE);

mIsBound = true;

}

/**

* 解除与服务的绑定,unbind按钮被点击时会调用这个方法

*/

void doUnbindService(){

//如果服务被绑定,则解除与服务绑定。

if(mIsBound){

unbindService(mConnection);

mIsBound = false;

}

}

/**

* 当Activity被销毁时,调用解除绑定服务的方法,解除被绑定的服务。

*/

@Override

protectedvoid onDestroy(){

super.onDestroy();

//解除被绑定的服务。

doUnbindService();

}

/**

* bind按钮的点击事件监听器接口实现。

*/

private OnClickListener mBindListener = new OnClickListener(){

publicvoid onClick(View v){

//绑定并启动服务。

doBindService();

}

};

/**

* unbind按钮的点击事件监听器接口实现。

*/

private OnClickListener mUnbindListener = new OnClickListener(){

publicvoid onClick(View v){

//解除被绑定的服务。

doUnbindService();

}

};

/**

* Activity被首次启动时,会调用这个方法。

*/

@Override

protectedvoid onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

//填充Activity

setContentView(R.layout.local_service_binding);

//查找布局中的bind按钮,并设置点击事件的监听器

Button button = (Button)findViewById(R.id.bind);

button.setOnClickListener(mBindListener);

//查找布局中的unbind按钮,并设置点击事件的监听器

button = (Button)findViewById(R.id.unbind);

button.setOnClickListener(mUnbindListener);

}

}

}

5. 创建服务(LocalService.java)

package my.android.test;

import android.app.Service;

import android.content.Intent;

import android.os.Binder;

import android.os.HandlerThread;

import android.os.IBinder;

import android.os.Handler;

import android.os.Looper;

import android.os.Message;

import android.os.Process;

import android.util.Log;

import android.widget.Toast;

/**

* LocalService基础Android的Service类,实现应用的本地服务组件。

* 该服务使用HandlerThread类创建了服务自己的线程和消息循环,

* 因此,不会因为服务中的长时处理,而阻塞界面的刷新,影响用户体验。

*/

publicclass LocalService extends Service {

//用于保存本服务自己的消息循环对象Looper

private Looper mServiceLooper;

//用于保存内部类ServiceHandler的对象实例,它继承了Android的Handler类,

//用于处理发送给服务的消息。

private ServiceHandler mServiceHandler;

/**

* 这个类用于给客户端提供绑定对象,因为本示例的服务与客户端运行在同一个

* 主进程中,所以不需要处理进程间通信(IPC)

*/

publicclass LocalBinder extends Binder{

LocalService getService(){

//返回本服务的实例。

return LocalService.this;

}

}

/**

* 服务被首次创建时,系统调用这个方法。

* Android服务组件必须覆写这个方法

*/

@Override

publicvoid onCreate(){

//创建线程对象,并启动线程。

HandlerThread thread = new HandlerThread("ServiceStartArguments", Process.THREAD_PRIORITY_BACKGROUND);

thread.start();

//获取线程的消息循环对象

mServiceLooper = thread.getLooper();

//用线程的消息循环对象创建消息处理对象。

mServiceHandler = new ServiceHandler(mServiceLooper);

}

/**

* 启动类型服务必须实现这个方法,客户端每次调用startService()方法时,

* 系统都会调用这个方法。

* @param intent:它是传递给startService()方法的Intent对象。

* @param flags:有关启动请求的附加数据,可以是:0、START_FLAG_REDELIVERY或START_FLAG_RETRY.

* @param startId:一个唯一的整数,代表一次具体的请求,用于stopSelfResult(int)方法。

*/

@Override

publicint onStartCommand(Intent intent, int flags, int startId){

Log.i("LocalService", "Received star id" + startId + ":" + intent);

//显示服务启动的提示信息

Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();

//获取要传递给服务消息循环的Message对象。

Message msg = mServiceHandler.obtainMessage();

//初始化Message对象的成员变量。

msg.arg1 = startId;

msg.obj = "Message processing......" + startId;

//把消息发送给服务线程的消息循环。

mServiceHandler.sendMessage(msg);

returnSTART_STICKY;

}

/**

* 必须覆写这个方法,服务被终止时要调用这个方法,清理服务所占用的资源。

*/

@Override

publicvoid onDestroy(){

//退出服务线程的消息循环。

mServiceLooper.quit();

//显示服务被退出的提示信息。

Toast.makeText(this, R.string.local_service_stopped, Toast.LENGTH_SHORT).show();

}

/**

* 绑定型服务必须覆写这个方法,启动型服务也可覆写这个方法,只要返回null即可。

*/

@Override

public IBinder onBind(Intent intent){

//返回本服务对象实例。

returnmBinder;

}

privatefinal IBinder mBinder = new LocalBinder();

/**

* 该类继承Android的Handler类,为线程的消息循环提供发送和处理消息的功能,

* 本示例覆写了handleMessage()方法,用来处理发送给服务消息循环的消息。

*/

privatefinalclass ServiceHandler extends Handler{

//类实例化时,需要传入服务线程的消息循环对象

public ServiceHandler(Looper looper){

super(looper);

}

/**

* 覆写Handler类的handleMessage()方法,当服务线程的消息循环接收到外部

* 发送的消息时,会调用这个方法来处理对应的消息,本示例只是简单的向用户提示消息被处理的信息。

*/

@Override

publicvoid handleMessage(Message msg){

long endTime = System.currentTimeMillis() + 5 * 1000;

while (System.currentTimeMillis() < endTime){

synchronized(this){

try{

wait(endTime - System.currentTimeMillis());

CharSequence cs = msg.obj.toString();

Toast.makeText(LocalService.this, cs, Toast.LENGTH_SHORT).show();

//showNotification();

}catch(Exception e){

//

}

}

}

//消息被处理之后,终止本服务。

LocalService.this.stopSelf();

}

}

}

热点内容
连接数据库的服务器 发布:2024-11-26 04:17:51 浏览:492
java字符串编程 发布:2024-11-26 04:14:39 浏览:896
数据库修复破解 发布:2024-11-26 04:04:52 浏览:653
在线解压百度云 发布:2024-11-26 03:58:02 浏览:272
密码万能钥匙的密码怎么看密码 发布:2024-11-26 03:46:12 浏览:998
wds桥接后副路由器如何改无线密码 发布:2024-11-26 03:41:54 浏览:474
编程要求电脑什么配置高 发布:2024-11-26 03:41:09 浏览:467
抗解压模拟器软件下载 发布:2024-11-26 03:27:33 浏览:933
python获取文件列表 发布:2024-11-26 03:18:28 浏览:222
减刑算法 发布:2024-11-26 03:18:27 浏览:182