当前位置:首页 » 安卓系统 » android建立服务

android建立服务

发布时间: 2025-08-05 04:23:29

1. 如何创建android系统服务

1、 撰写一个aidl文件,定义服务的接口,将在编译过程中通过aidl工具生成对应的java接口。一般系统服务的aidl文件都放在framework\base\core\java\android\os目录中。

以我所写的IMyTool.aidl为例。在.aidl中定义自己需要加入的方法,编写规则和java接口差不多,这里不多说。

2、 将aidl文件名添加到frameworks\base\目录下的Android.mk编译脚本文件中。

如:

LOCAL_SRC_FILES += \

core/java/android/accessibilityservice/.aidl\

…\

core/java/android/os/IMyTool.aidl\



IMyTool.aidl即我加进去的aidl文件,加入后才能在make过程中编译到,否则将在后面的SystemServer添加系统服务时会报错提示找不到对应类。

3、 编写真正工作的服务类,继承IMyTool.Stub类(AIDL文件名.Stub,aidl生成的接口中的内部类,是一个Binder)。

服务类一般都放在framework\base\services\java\com\android\server目录中。

例如:

public class MyToolService extends IMyTool.Stub {

实现IMyTool.aidl中定义的接口。

}

4、 将自定义服务注册到SystemServer,使得开机过程中被添加。

在framework\base\services\java\com\android\server目录中的SystemServer中启动服务代码处加入:

try {

Slog.i(TAG, "MyToolService");

ServiceManager.addService(Context.MY_TOOL_SERVICE,new MyToolService(context));// MyToolService构造函数自己定义,一般都会用到Context

} catch(Throwable e) {

Slog.e(TAG, "Failure startingMyToolService", e);

}

上面代码中Context.MY_TOOL_SERVICE是自己在Context类中定义的常量,也就是给服务定义的名字,使用常量方便获取服务,而不需要记住注册服务时用的名字,且想换名字时只需改一个常量的值。

2. 如何给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();

}

}

}

3. 如何在Android中添加系统服务

这里说的系统服务,是指捆绑在system_process进程中的服务。仔细阅读源码可以发现,在frameworks/base/services/java/com/android/server/SystemServer.java中添加了很多服务,什么熵信息、电量、wife等等服务,这些服务启动都在launcher之前,一般要继承Binder或者继承一个AIDL。下面试着来添加一个简单系统服务。
一、在frameworks/base/core/java/android/os/ 增加一个aidl文件,最后用aidl工具生产一个Java文件,这样可以方便后面:然后在修改/frameworks/base/Android.mk,在LOCAL_SRC_FILES里添加一行:core/java/android/os/IYtTtsService.aidl \不确定补充:把AIDL文件写在这个地方似乎可以避免加@hide
二 、在frameworks/base/services/java/com/android/server/ 新建要增加的service,继承上面aidl生产的java
三、在frameworks/base/services/java/com/android/server/SystemServer.java, ServerThread中run()方法中增加代码
四、在ContextImpl getSystemService中添加代码
五、测试代码

4. 在Android开发中怎么将手机作为服务器

工具/原料

root软件:网络root为佳!如果你已经获取了权限,可以跳过。

ksweb软件:用于搭建手机php服务器的软件。

nat123软件:强大的内网端口映射软件,不需要路由器权限。

方法/步骤

1.安装手机本地php+mysql服务器环境篇:

1.1安装ksweb软件,安装好ksweb后,会在手机上生成一个文件夹htdocs,其目录是mnt/sdcard/htdocs,htdocs是网站的根目录。

1.2安装mysql直接点击mysql管理,点击选择“是”然后解压便可自动安装。mysql的账号密码随后再改(在设置里面更改)。

1.3安装好MySQL之后,我们需要对ksweb进行一些设置方可更好使用。

1.3.1端口的更改步骤:(启用root→更改80端口)手机服务器启用root,在ksweb设置里面把root打钩。

1.3.2开启手机80端口方法:把8080端口改为80端口,并把PHP服务,MySQL都打勾。其他一些设置比如MySQL密码,开机自启动等选项大家根据需要自行修改即可!

1.4ksweb全部设置好后,我们打开手机本地服务器地址localhost:80,表示设置好了。

我们点击页面中的“EnterKSWEBWeb Interface”可以看到手机服务器的一些配置信息(默认账号密码都是“admin”),表示手机服务搭建成功,一切正常!

2.利用nat123软件进行内网80端口映射篇:

2.1注册账号,我们先到其官网注册账号官网,大家网络nat123即可。

2.2登陆并添加域名解析。

2.2.1应用名称,要搭建自己的博客,可以填XX的博客,或者XX的个人博客等。

2.2.2内网端口,只有root的手机才填80端口。

2.2.3内网地址这个默认localhost就行。

2.2.4 外网域名,如果没有自己的域名,可以用官方免费的二级域名,注意格式,一切填好之后,点击确认保存即可!

2.3 下载并安装登陆安卓版的nat123,就自动解析了。

3.4接下来在另一台电脑上输入刚才的域名访问,表示安卓手机web服务器安装成功,网站搭建成功!

注意事项

另外如果需要手机网站一直都可以访问,需要下载一个永不关屏软件,这样手机就不会进入睡眠状态,服务也不会停止,不过比较耗电。

外网能访问内网手机web服务器的关键是nat123端口映射功能,利用nat123端口映射功能,不只是搭建内网网站,还可以挖掘其他的许多用途。

热点内容
python不支持的数据类型有 发布:2025-09-18 01:50:23 浏览:638
长江存储科技招聘 发布:2025-09-18 01:44:48 浏览:763
斯维尔加密狗 发布:2025-09-18 01:31:00 浏览:248
手把手win7搭建web服务器 发布:2025-09-18 01:25:53 浏览:726
硬盘缓存128m 发布:2025-09-18 01:15:13 浏览:753
苹果手机设备密码是指什么 发布:2025-09-18 01:02:26 浏览:467
asp门户网站源码 发布:2025-09-18 00:54:00 浏览:449
java数据库例子 发布:2025-09-18 00:53:58 浏览:220
sh脚本输出 发布:2025-09-18 00:48:10 浏览:258
我的世界服务器箱里的东西没了 发布:2025-09-18 00:39:20 浏览:934