今天阅读Android源码,看到文件SystemUIService.java (frameworks\base\packages\systemui\src\com\android\systemui)
@Override
public void onCreate() {
// Pick status bar or system bar.
IWindowManager wm = IWindowManager.Stub.asInterface(
ServiceManager.getService(Context.WINDOW_SERVICE));
try {
SERVICES[0] = wm.canStatusBarHide()
? R.string.config_statusBarComponent
: R.string.config_systemBarComponent;
} catch (RemoteException e) {
Slog.w(TAG, "Failing checking whether status bar can hide", e);
}
为了更好的理解代码,于是自己也想写一个AIDL的程序。
[1]建立一个工程Leader01_aidl
IMyservice.aidl
package blog.topicmmi.test;
interface IMyService{
String getValue();
}
MyService.java
package blog.topicmmi.test;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
public class MyService extends Service
{
public class MyServiceImpl extends IMyService.Stub
{
@Override
public String getValue() throws RemoteException
{
return "我的第一个AIDL程序";
}
}
@Override
public IBinder onBind(Intent intent)
{
return new MyServiceImpl();
}
}
AndroidManifest.xml
<service android:name=".MyService">
<intent-filter>
<action android:name="blog.topicmmi.test.IMyService"/>
</intent-filter>
</service>
[2]再建立一个客户端的工程Leader_aidlclient
将Leader01_aidl\gen\blog拷到leader_aidlclient\src
Main.java
package net.blogjava.mobile;
import blog.topicmmi.test.IMyService;
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.TextView;
public class Main extends Activity implements OnClickListener
{
private IMyService myService = null;
private Button btnInvokeAIDLService;
private Button btnBindAIDLService;
private TextView textView;
private ServiceConnection serviceConnection = new ServiceConnection()
{
// 当与service的连接建立后被调用
@Override
public void onServiceConnected(ComponentName name, IBinder service)
{
myService = IMyService.Stub.asInterface(service);
btnInvokeAIDLService.setEnabled(true);
}
@Override
public void onServiceDisconnected(ComponentName name)
{
// TODO Auto-generated method stub
}
};
@Override
public void onClick(View view)
{
switch (view.getId())
{
case R.id.btnBindAIDLService:
//bindService()绑定到一个service.Android系统调用service的onBind()方法,它返回一个用来与service交互的IBinder.
//bindService()会立即返回,它不会返回IBinder给客户端.要接收IBinder,客户端必须创建一个ServiceConnection的实例并传给bindService().
//ServiceConnection包含一个回调方法,系统调用这个方法来传递要返回的IBinder.
bindService(new Intent("blog.topicmmi.test.IMyService"),
serviceConnection, Context.BIND_AUTO_CREATE);
break;
case R.id.btnInvokeAIDLService:
try
{
textView.setText(myService.getValue());
}
catch (Exception e)
{
}
break;
}
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnInvokeAIDLService = (Button) findViewById(R.id.btnInvokeAIDLService);
btnBindAIDLService = (Button) findViewById(R.id.btnBindAIDLService);
btnInvokeAIDLService.setEnabled(false);
textView = (TextView) findViewById(R.id.textview);
btnInvokeAIDLService.setOnClickListener(this);
btnBindAIDLService.setOnClickListener(this);
}
}
[3]运行后
点“绑定AIDL服务”按钮后”调用AIDL服务"会反显.再点”调用AIDL服务"按钮:
心得:无论多容易的事情,都要在代码上实践一下,这样容易记住!
完整源码地址:http://download.csdn.net/detail/topicdev/5247556