求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
  
 
 
     
   
分享到
一个Demo学完Android中所有的服务
 
火龙果软件    发布于 2013-9-22
 

作者通过一个demo中的代码介绍了多种服务功能的实现。如果可以的话去下一个demo相信效果一定很显著。这个例子来自“安卓巴士”,经阅读,理解,写此文章,希望阅读完一个Demo学完Android中所有的服务可以对学习中的你有所帮助。

说明:这个例子实现了Android中常见的许多服务,下面是实现的截图

接下来,以源代码的方式分析这个例子

1.MainActivity--主界面

这个类主要是实现用户所看到的这个Activity,其中包含了一系列的按钮,用户点击按钮执行相应的动作,所以在这个类中主要是对按钮的定义和对按钮绑定相应的监听器,下面是实现的代码:

package lovefang.stadyService;   
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.view.View;
import android.content.Intent;
import android.util.Log;
/**这是使用后台服务的学习例子*/
public class MainStadyServics extends Activity {
/**参数设置*/
Button startServiceButton;// 启动服务按钮
Button shutDownServiceButton;// 关闭服务按钮
Button startBindServiceButton;// 启动绑定服务按钮
Button sendBroadcast;// 使用广播
Button notificationButton;// 使用通知功能
Button alarmButton;// 使用闹钟
Button handlerButton;// 使用handler
Button asyncButton;// 使用异步加载
Button phoneStateButton;// 查看手机状态
Button callphoneButton;// 拨打电话
Button vibratorButton;// 使用震动
CountService countService;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.v("MainStadyServics", "setContentView");
setContentView(R.layout.main);
getWidget();
regiestListener();
}
/**获得组件*/
public void getWidget(){
startServiceButton = (Button)findViewById(R.id.startServerButton);
startBindServiceButton = (Button)findViewById(R.id.startBindServerButton);
shutDownServiceButton = (Button)findViewById(R.id.sutdownServerButton);
sendBroadcast = (Button)findViewById(R.id.sendBroadcast);
notificationButton = (Button)findViewById(R.id.notification);
alarmButton = (Button)findViewById(R.id.alarm);
handlerButton = (Button)findViewById(R.id.handler);
asyncButton = (Button)findViewById(R.id.async);
phoneStateButton = (Button) findViewById(R.id.phonestate);
callphoneButton = (Button) findViewById(R.id.callphone);
vibratorButton = (Button) findViewById(R.id.vibrator);
}
/**为按钮添加监听*/
public void regiestListener(){
startServiceButton.setOnClickListener(startService);
shutDownServiceButton.setOnClickListener(shutdownService);
startBindServiceButton.setOnClickListener(startBinderService);
sendBroadcast.setOnClickListener(broadcastReceiver);
notificationButton.setOnClickListener(notification);
alarmButton.setOnClickListener(startAlarm);
handlerButton.setOnClickListener(handler);
asyncButton.setOnClickListener(async);
phoneStateButton.setOnClickListener(phonestate);
callphoneButton.setOnClickListener(callphoneEvent);
vibratorButton.setOnClickListener(vibrator);
}
/**启动服务的事件监听*/
public Button.OnClickListener startService = new Button.OnClickListener(){
public void onClick(View view){
/**单击按钮时启动服务*/
Intent intent = new Intent(MainStadyServics.this,CountService.class);
startService(intent);
Log.v("MainStadyServics", "start Service");
}
};
/**关闭服务*/
public Button.OnClickListener shutdownService = new Button.OnClickListener(){
public void onClick(View view){
/**单击按钮时启动服务*/
Intent intent = new Intent(MainStadyServics.this,CountService.class);
/**退出Activity是,停止服务*/
stopService(intent);
Log.v("MainStadyServics", "shutDown serveice");
}
};
/**打开绑定服务的Activity*/
public Button.OnClickListener startBinderService = new Button.OnClickListener(){
public void onClick(View view){
/**单击按钮时启动服务*/
Intent intent = new Intent(MainStadyServics.this,UseBrider.class);
startActivity(intent);
Log.v("MainStadyServics", "start Binder Service");
}
};
/**打开广播学习的按钮*/
public Button.OnClickListener broadcastReceiver = new Button.OnClickListener(){
public void onClick(View view){
Intent intent = new Intent(MainStadyServics.this,UseBroadcast.class);
startActivity(intent);
Log.v("MainStadyServics","start broadcast");
}
};
/**打开通知*/
public Button.OnClickListener notification = new Button.OnClickListener(){
public void onClick(View view){
Intent intent = new Intent(MainStadyServics.this, UseNotification.class);
startActivity(intent);
Log.v("MainStadyService ","start Notification");

}
};
/**使用闹钟*/
public Button.OnClickListener startAlarm = new Button.OnClickListener(){
public void onClick(View view){
Intent intent = new Intent(MainStadyServics.this, UseAlarmManager.class);
startActivity(intent);
Log.v("MainStadyService ","start alarm");
}
};
public Button.OnClickListener handler= new Button.OnClickListener(){
public void onClick(View view){
Intent intent = new Intent(MainStadyServics.this, UseHandleMessage.class);
startActivity(intent);
Log.v("MainStadyService ","start handle");
}
};
public Button.OnClickListener async= new Button.OnClickListener(){
public void onClick(View view){
Intent intent = new Intent(MainStadyServics.this, UseAsyncTask.class);
startActivity(intent);
Log.v("MainStadyService ","start handle");
}
};
public Button.OnClickListener phonestate= new Button.OnClickListener(){
public void onClick(View view){
Intent intent = new Intent(MainStadyServics.this, UsePhoneState.class);
startActivity(intent);
Log.v("MainStadyService ","start phonestate");
}
};
public Button.OnClickListener callphoneEvent= new Button.OnClickListener(){
public void onClick(View view){
Intent intent = new Intent(MainStadyServics.this, UseActionCall.class);
startActivity(intent);
Log.v("MainStadyService ","start callphone");
}
};
public Button.OnClickListener vibrator= new Button.OnClickListener(){
public void onClick(View view){
Intent intent = new Intent(MainStadyServics.this, UseVibrator.class);
startActivity(intent);
Log.v("MainStadyService ","start callphone");
}
};
/***/
protected void onDestroy(){
super.onDestroy();
Intent intent = new Intent(MainStadyServics.this,CountService.class);
/**退出Activity是,停止服务*/
stopService(intent);
}
}

2.启动服务按钮

这个类实现的是第一个按钮的功能,在这个类中新开了一个线程,并每隔一秒打印出一行日志

代码如下:

package lovefang.stadyService;   
/**引入包*/
import android.app.Service;// 服务的类
import android.os.IBinder;
import android.os.Binder;
import android.content.Intent;
import android.util.Log;
/**计数的服务*/
public class CountService extends Service{
/**创建参数*/
boolean threadDisable ;
int count;

public IBinder onBind(Intent intent){
return null;
}
public void onCreate(){
super.onCreate();
/**创建一个线程,每秒计数器加一,并在控制台进行Log输出*/
new Thread(new Runnable(){
public void run(){
while(!threadDisable){
try{
Thread.sleep(1000);
}catch(InterruptedException e){

}
count++;
Log.v("CountService","Count is"+count);
}
}
}).start();
}
public void onDestroy(){
super.onDestroy();
/**服务停止时,终止计数进程*/
this.threadDisable = true;
}
public int getConunt(){
return count;
}
class ServiceBinder extends Binder{
public CountService getService(){
return CountService.this;
}
}
}

3.绑定服务

服务有两种实现的方法:

(1)startService,启动服务,这时需要程序员管理服务的生命周期

(2)bindService,绑定服务,此时Service与Activity绑定在一起

下面是实现的代码:

package lovefang.stadyService;   
/**引入包*/
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.util.Log;

/**通过bindService和unBindSerivce的方式启动和结束服务*/
public class UseBrider extends Activity {
/**参数设置*/
CountService countService;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new UseBriderFace(this));
Intent intent = new Intent(UseBrider.this,CountService.class);
/**进入Activity开始服务*/
bindService(intent, conn, Context.BIND_AUTO_CREATE);

}
private ServiceConnection conn = new ServiceConnection(){
/**获取服务对象时的操作*/
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
countService = ((CountService.ServiceBinder)service).getService();

}
/**无法获取到服务对象时的操作*/
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
countService =null;
}


};
protected void onDestroy(){
super.onDestroy();
this.unbindService(conn);
Log.v("MainStadyServics", "out");
}
}

接下来为您介绍发送广播、Notification通知、Alarm 闹钟等服务的具体内容

4.发送广播

使用sendBroadcast,向一个Action发送广播,并由相应的广播接收器接收并执行相应的动作

实现的代码如下:

(1)打开广播服务

package lovefang.stadyService;   
/**引入包*/
import android.view.View;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.widget.Button;
/**使用Broadcast,这是一个发送广播的类*/
public class UseBroadcast extends Activity{
/**创建参数*/
private Button sendBroadcast;
/**创建Activity*/
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.broadcast);// 使用布局文件
getView();
sendBroadcast.setOnClickListener(sendBroadcastClick);// 添加事件监听
}
public void getView(){
sendBroadcast = (Button)findViewById(R.id.sendBroadcast);
}
/**创建事件监听*/
public Button.OnClickListener sendBroadcastClick = new Button.OnClickListener(){
public void onClick(View view){
Intent intent = new Intent();// 创建意图
intent.putExtra("CONTENT", "This is a Braodcast demo");// 设置广播的内容
intent.setAction("lovefang.stadyService");// 设置广播的Action
sendBroadcast(intent);
}
};

}

(2 )处理广播消息

package lovefang.stadyService;   
/***/
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
/**这是一个接收广播的类*/
public class UseBroadcastReceiver extends BroadcastReceiver{
public void onReceive(Context context, Intent intent){
Log.v("UseBroadcastReceiver", "I get a message");
}
}

5.Notification通知

这个称之为通知,显示在手机的通知栏,用户可以清除,可以点击

实现的代码如下:

package lovefang.stadyService;   

import android.content.Intent;
import android.os.Bundle;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.net.Uri;
import android.media.RingtoneManager;
import android.widget.Button;
import android.view.View;

/**使用notification*/
public class UseNotification extends Activity {
/**创建组件*/
private Button textButton;
private Button soundButton;// 声音通知
private Button vibrateButton;// 震动通知
private Button ledButton;// led通知
private Button offButton;// 关闭通知
NotificationManager notificationManager;
/**创建Activity*/
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.notification);
getComment();
registerComment();
}
/**获取对象*/
public void getComment(){
/**获取Notification对象*/
notificationManager = (NotificationManager)this.getSystemService(NOTIFICATION_SERVICE);
textButton = (Button)findViewById(R.id.notificationMessage);
soundButton =(Button)findViewById(R.id.notificationSound);
vibrateButton = (Button)findViewById(R.id.notificationVibrate);
ledButton = (Button)findViewById(R.id.notificationLED);
offButton = (Button)findViewById(R.id.offnotification);
}
/**注册对象*/
public void registerComment(){
textButton.setOnClickListener(notificationMessage);
soundButton.setOnClickListener(notificationSound);
vibrateButton.setOnClickListener(notificationVibrate);
ledButton.setOnClickListener(notificationLed);
offButton.setOnClickListener(notificationOff);
}
public Button.OnClickListener notificationMessage = new Button.OnClickListener(){
public void onClick(View view){
Notification notification = new Notification();// 创建Notification对象
notification.icon = R.drawable.icon;
notification.tickerText = "This is text notication";// 设置通知消息
/**单击通知后的Intent,此例子单击后还是在当前页面*/
PendingIntent intent = PendingIntent
.getActivity(UseNotification.this,
0, new Intent(UseNotification.this,UseNotification.class)
, 0);
/**设置通知消息*/
notification.setLatestEventInfo(UseNotification.this
,"Notification","Content of Notification Demo",intent);
/**执行通知*/
notificationManager.notify(0, notification);
}
};
public Button.OnClickListener notificationSound = new Button.OnClickListener(){
public void onClick(View view){
/**创建通知对象*/
Notification notification = new Notification();
/**获取系统当前声音*/
String ringName = RingtoneManager.getActualDefaultRingtoneUri(
UseNotification.this, RingtoneManager.TYPE_RINGTONE)
.toString();
/**设置系统当前铃声为此通知的铃声*/
notification.sound = Uri.parse(ringName);
/**执行通知*/
notificationManager.notify(0,notification);
}
};
/**震动通知*/
public Button.OnClickListener notificationVibrate = new Button.OnClickListener(){
public void onClick(View view){
Notification notification = new Notification();// 创建Notification对象
notification.vibrate = new long[] {0, 100, 200, 300};// 设置通知震动模式
notificationManager.notify(0,notification);// 执行通知
}
};
/**LED通知*/
public Button.OnClickListener notificationLed = new Button.OnClickListener(){
public void onClick(View view){
Notification notification = new Notification();// 创建Notification对象
notification.ledOnMS = 300;// 设置led开始闪光的时间
notification.ledOffMS = 1000;// 设置关闭时的闪光时间
notificationManager.notify(0,notification);// 执行通知
}
};
/**关闭通知*/
public Button.OnClickListener notificationOff = new Button.OnClickListener(){
public void onClick(View view){
notificationManager.cancel(0);// 关闭通知
}
};
}

6.Alarm 闹钟服务

package lovefang.stadyService;   

import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.view.View;
import android.app.AlarmManager;

import java.util.Calendar;

public class UseAlarmManager extends Activity {
/**创建参数*/
private Button startAlarm;
private Button shutdownAlarm;
private AlarmManager alarm;

/**创建Activity*/
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.usealarmmanager);
getWidget();
}
public void getWidget(){
startAlarm = (Button)findViewById(R.id.startAlarm);
shutdownAlarm = (Button)findViewById(R.id.shutDowntAlarm);
alarm = (AlarmManager)getSystemService(ALARM_SERVICE);// 获取AlarmManager
}
public void registerWidget(){
startAlarm.setOnClickListener(startAlarms);
shutdownAlarm.setOnClickListener(shutdownAlarms);
}
/**启动闹钟*/
public Button.OnClickListener startAlarms = new Button.OnClickListener(){
public void onClick(View view){
// 设置10秒后出发闹钟
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());// 设置calendar的时间
calendar.add(Calendar.SECOND, 10);

alarm.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), null);
}
};
public Button.OnClickListener shutdownAlarms = new Button.OnClickListener(){
public void onClick(View view){
alarm.cancel(null);
}
};
}

下页将为您介绍获取手机的状态、Vibrator 震动功能等服务的具体内容

7.获取手机的状态

这个功能实现的是获取用户手机的一些定义的信息

package lovefang.stadyService;   
/**引入包*/
import android.os.Bundle;
import android.app.Activity;
import android.app.Service;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.content.ContentResolver;//This class provides applications access to the content model.
import android.telephony.TelephonyManager;
import android.util.Log;
/**获取手机的状态*/
public class UsePhoneState extends Activity{
/**创建参数*/
private ContentResolver cr;
private Button getStateButton;// 用来获取用户的手机状态
/**创建Activity*/
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.usephonestate);

cr = getContentResolver();
Log.v("UsePhonestate","cr = getContentResolver()");
Log.v("UsePhonestate","setContentView");
getStateButton = (Button) findViewById(R.id.button_getphonestate);
Log.v("UsePhonestate","getStateButton");
getStateButton.setOnClickListener(getState);
Log.v("UsePhonestate","getStateButton.setOnClickListener");
}
private Button.OnClickListener getState = new Button.OnClickListener(){
public void onClick(View view){
/**获得TelephonyManager对象*/
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Service.TELEPHONY_SERVICE);
/**获取电信网络级别*/
String teleCode = telephonyManager.getNetworkCountryIso();
/**获取电信网络公司代码*/
String teleComCode = telephonyManager.getNetworkOperator();
/**获取电信网络公司名称*/
String teleComName = telephonyManager.getNetworkOperatorName();
/**获取行动通信类型*/
int TypeCode = telephonyManager.getPhoneType();

String type = "";

switch(TypeCode){
case TelephonyManager.PHONE_TYPE_NONE:
type = "PHONE_TYPE_NONE";
break;
case TelephonyManager.PHONE_TYPE_GSM:
type = "PHONE_TYPE_GSM";
break;
case TelephonyManager.PHONE_TYPE_CDMA:
type = "PHONE_TYPE_CDMA";
break;
}
/**获取网络类型*/
int netTypeCode = telephonyManager.getNetworkType();
String netType = "NETWORK_TYPE_UNKNOW";
switch(netTypeCode){
case TelephonyManager.NETWORK_TYPE_1xRTT:
netType = "NETWORK_TYPE_1xRTT";
break;
case TelephonyManager.NETWORK_TYPE_CDMA:
netType = "NETWORK_TYPE_CDMA";
break;
case TelephonyManager.NETWORK_TYPE_EDGE:
netType = "NETWORK_TYPE_EDGE";
break;
case TelephonyManager.NETWORK_TYPE_EVDO_0:
netType = "NETWORK_TYPE_EVDO_0";
break;
case TelephonyManager.NETWORK_TYPE_EVDO_A:
netType = "NETWORK_TYPE_EVDO_A";
break;
case TelephonyManager.NETWORK_TYPE_GPRS:
netType = "NETWORK_TYPE_GPRS";
break;
case TelephonyManager.NETWORK_TYPE_HSDPA:
netType = "NETWORK_TYPE_HSDPA";
break;
case TelephonyManager.NETWORK_TYPE_HSPA:
netType = "NETWORK_TYPE_HSPA";
break;
case TelephonyManager.NETWORK_TYPE_HSUPA:
netType = "NETWORK_TYPE_HSUPA";
break;
case TelephonyManager.NETWORK_TYPE_IDEN:
netType = "NETWORK_TYPE_IDEN";
break;
case TelephonyManager.NETWORK_TYPE_UMTS:
netType = "NETWORK_TYPE_UMTS";
break;
default:
break;
}

/**获取漫游状态*/
boolean roamStatusCode = telephonyManager.isNetworkRoaming();
String roamStatus = "NOT ROAMINF";
if(roamStatusCode){
roamStatus = "ROAMING";
}

/**获取手机唯一标识*/
String imei = telephonyManager.getDeviceId();
/**获取手机IMEI SV*/
String imeiSV = telephonyManager.getDeviceSoftwareVersion();
/**获取手机IMSI*/
String imsi = telephonyManager.getSubscriberId();

/**蓝牙服务*/
String statusCode = android.provider.Settings.System.getString(cr,
android.provider.Settings.System.BLUETOOTH_ON);
String bulettothStatus = "";
if(statusCode.equals("1")){
bulettothStatus = "ENABLE";
}else{
bulettothStatus = "DISABLE";
}

/**飞行模式是否打开*/
statusCode = android.provider.Settings.System.getString(cr,
android.provider.Settings.System.AIRPLANE_MODE_ON);

String AirplaneStatus = "";
if(statusCode.equals("1")){
AirplaneStatus = "ENABLE";
}else{
AirplaneStatus = "DISABLE";
}

/**数据漫游模式是否打开*/
statusCode = android.provider.Settings.System.getString(cr,
android.provider.Settings.System.DATA_ROAMING);
String dataRoamStatus = "";
if(statusCode.equals("1")){
dataRoamStatus = "ENABLE";
}else{
dataRoamStatus = "DISABLE";
}
TextView txt = (TextView) findViewById(R.id.text_showphonestate);
StringBuilder sb = new StringBuilder();
sb.append("teleCode: "+teleCode+"\n");
sb.append("teleComCode: "+teleComCode+"\n");
sb.append("teleComName: "+teleComName+"\n");
sb.append("type: "+type+"\n");
sb.append("netType: "+netType+"\n");
sb.append("roamStatus: "+roamStatus+"\n");
sb.append("imei: "+imei+"\n");
sb.append("imeiSV: "+imeiSV+"\n");
sb.append("imsi: "+imsi+"\n");
sb.append("bulettothStatus: "+bulettothStatus+"\n");
sb.append("AirplaneStatus: "+AirplaneStatus+"\n");
sb.append("dataRoamStatus: "+dataRoamStatus+"\n");

txt.setText(sb.toString());
}
};
}

8.Vibrator 震动功能

实现对手机震动的管理

package lovefang.stadyService;   
/***/
import android.os.Bundle;
import android.os.Vibrator;
import android.app.Activity;
import android.view.View;
import android.content.Context;
import android.widget.Button;
/**如何实现手机的震动提示Vibrator*/
public class UseVibrator extends Activity{
/***/
private Button vibrator_1_Button;
private Button vibrator_2_Button;
private Button vibrator_3_Button;
private Vibrator vibrator;
/***/
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.use_vibrator);
vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
getWidget();
registerWidget();
}

public void getWidget(){
vibrator_1_Button = (Button) findViewById(R.id.button_vibrator_1);
vibrator_2_Button = (Button) findViewById(R.id.button_vibrator_2);
vibrator_3_Button = (Button) findViewById(R.id.button_vibrator_3);
}

public void registerWidget(){
vibrator_1_Button.setOnClickListener(vibrator_1);
vibrator_2_Button.setOnClickListener(vibrator_2);
vibrator_3_Button.setOnClickListener(vibrator_3);
}
/**震动一次*/
public Button.OnClickListener vibrator_1 = new Button.OnClickListener(){
public void onClick(View view){
/**long参数数组里大参数的含义*/
/**第一个参数表示等待100毫秒后开始震动*/
/**第二个参数表示震动100毫秒后停止震动*/
vibrator.vibrate(new long[]{100,100}, 0);
}
};
/**震动两次*/
public Button.OnClickListener vibrator_2 = new Button.OnClickListener(){
public void onClick(View view){
vibrator.vibrate(new long[]{1000,3000,1000,3000}, 0);
}
};
/**震动三次*/
public Button.OnClickListener vibrator_3 = new Button.OnClickListener(){
public void onClick(View view){
vibrator.vibrate(new long[]{1000,1000,1000,2000,1000,300}, 0);
}
};
}
 
相关文章

手机软件测试用例设计实践
手机客户端UI测试分析
iPhone消息推送机制实现与探讨
Android手机开发(一)
 
相关文档

Android_UI官方设计教程
手机开发平台介绍
android拍照及上传功能
Android讲义智能手机开发
相关课程

Android高级移动应用程序
Android系统开发
Android应用开发
手机软件测试
 
分享到
 
 


android人机界面指南
Android手机开发(一)
Android手机开发(二)
Android手机开发(三)
Android手机开发(四)
iPhone消息推送机制实现探讨
手机软件测试用例设计实践
手机客户端UI测试分析
手机软件自动化测试研究报告
更多...   


Android高级移动应用程序
Android应用开发
Android系统开发
手机软件测试
嵌入式软件测试
Android软、硬、云整合


领先IT公司 android开发平台最佳实践
北京 Android开发技术进阶
某新能源领域企业 Android开发技术
某航天公司 Android、IOS应用软件开发
阿尔卡特 Linux内核驱动
艾默生 嵌入式软件架构设计
西门子 嵌入式架构设计
更多...