Android知识点汇总
目录
Android知识点: (3)
一:dom解析,以及写入数据到xml文件: (3)
二:连接socket并获取返回值 (4)
三:创建socket服务器 (4)
四:获取本地设备信息;执行串口命令 (5)
五:获取设备当前时间 (5)
六:对于节省代码 (6)
七:访问网络权限 (6)
八:显示ProgressDialog (6)
九:handle消息机制定义与对信息的处理 (6)
十:显示AlertDialog,以及对其进行按键处理 (7)
十一:判断网络是否连接 (8)
十二:判断是否连接有线网络 (8)
十三:判断是否能够ping通互联网:返回0则通,否则不通 (9)
十四:显示进度圈,防止用户继续其线程start (9)
十五:下载文件 (10)
十六:解析json文件(android中使用,解析本地文件夹) (11)
十七:解析服务器json文件,根据路径获取输入流并解析 (12)
十八:获取所有已经安装的apk的信息 (14)
十九:安装apk,分为静默安装与非静默安装,静默卸载 (15)
二零:发送与接收广播 (17)
二一:java中解析JSON文件 (18)
二二:获取文件列表 (19)
二三:DownloadManager (21)
附件一:android-apkinfo.json (23)
附件二:java_apkinfo_json (24)
二四:复制assets中资源文件到sdcard或data/files目录下 (25)
二五:解析与重写xml文件 (27)
二六:设置Viewpager的Adapter适配器 (29)
二七:设置listView的Adapter适配器 (30)
二八:设置按键监听器 (33)
二九:对于data中图片信息的处理与使用 (34)
三十:OnpageChangeListener页面切换监听器 (34)
三一:Activity之间数据的传递 (35)
三二:通过代码添加button (36)
三三:文件的输入输出 (37)
三四:关于文件路径 (38)
三五:对sd卡的读写权限设置 (38)
三六:file.getCanonicalPath() (39)
三七:命令行运行java文件 (39)
三八:activity无头标题 (40)
三九:activity全屏 (40)
四十:启动aitivity/service参数设置 (40)
四一:获取已经安装的apk信息 (40)
四二:Viewpager (41)
四三:LayoutInflater (42)
四四:mkdir与mkdirs (42)
四五:创建对象Drawable与Bitmap (43)
四六:获取屏幕分辨率 (43)
四七:消除EditText输入法弹框 (43)
四八:android:ellipsize的使用 (44)
四九:Edittext属性设置 (44)
五十:设置系统菜单语言 (45)
五一:android原生设置系统休眠时间 (45)
五二:判定ImageView是否可见 (45)
五三:关于fragment的使用 (46)
五四:打印全部的cursor信息 (47)
五五:拆分String,根据特殊符号 (48)
五六:获取与设置环境变量 (48)
五七:解析与获取文本信息 (48)
五八:实现本地升级功能 (49)
五九:获取挂载的存储设备的路径 (49)
六十:java反射机制,根据函数名调用函数 (50)
六一:简单添加Menu选项 (51)
六二:获取当前显示的应用包名 (52)
六三:kill某一执行进程 (52)
常用C函数含义解析: (54)
1、memset (54)
2、snprintf (54)
Android中遇到的小常识 (55)
1,查看进程相关信息 (55)
2,查看系统内存属性值 (55)
3,修改文件权限以及分组 (55)
Android知识点:
一:dom解析,以及写入数据到xml文件:
获取输入流:
File file = new File(String filepath);
InputStream instream = new FileInputStream(file);
private static void serialize(int data) throws Exception {
logs("rewrite xmlFile");
// 由android.util.Xml创建一个XmlSerializer实例
XmlSerializer serializer = Xml.newSerializer();
StringWriter writer = new StringWriter();
// 设置输出方向为writer
serializer.setOutput(writer);
serializer.startDocument("UTF-8", true);
serializer.startTag("", "datas");
serializer.startTag("", "data");
serializer.text("" + data);
serializer.endTag("", "data");
serializer.endTag("", "datas");
serializer.endDocument();
File file = new File(FILE_PATH + FILE_NAME);
if (file.exists()) {
file.delete();
file.createNewFile();
}
FileOutputStream io = new FileOutputStream(file);
String xmlString = writer.toString();
io.write(xmlString.getBytes("UTF-8"));
}
//解析输入流,获取输入流中信息
private static int parseXmlNative(InputStream is) throws Exception {
logs("parseXML in native");
String data2 = null; // 获取最终使用期限
// 得到Dom解析对象工厂
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
// 通过工厂创建Dom解析对象实例
DocumentBuilder db = factory.newDocumentBuilder();
// 将xml文件的输入流交给Dom解析对象进行解析,并将Dom树返回
Document document = db.parse(is);
// 通过Dom树接收到根元素
Element rootElement = document.getDocumentElement();
NodeList nodeList = rootElement.getElementsByTagName("data");
Log.i(TAG, "length = " + nodeList.getLength());
data2 = nodeList.item(0).getFirstChild().getNodeValue();
return Integer.parseInt(data2);
}
二:连接socket并获取返回值
try {
String sRead;
//参数为ip与端口号
Socket socket = new Socket(SERVER_IP, PORT);
BufferedReader br = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
sRead = br.readLine();
logs(sRead);
socket.close();
logs("socket is closed");
serialize(Integer.parseInt(sRead));
logs("serialize in file, data = "+ Integer.parseInt(sRead));
br.close();
} catch (Exception e) {
logs("Exception");
}
三:创建socket服务器
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(30000);
while (true) {
Socket s = ss.accept();
PrintStream ps = new PrintStream(s.getOutputStream()); ps.println("This is String in SocketMain!");
ps.close();
s.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
当socket获取连接请求时,返回值为:This is String in SocketMain!
四:获取本地设备信息;执行串口命令
获取本地mac地址:
private static String getEthMacAddress() {
try {
Process process = Runtime.getRuntime()
.exec("busybox ifconfig eth0");
BufferedReader br = new BufferedReader(new InputStreamReader( process.getInputStream()));
String inline = br.readLine();
String[] s = inline.split(" ");
String ethMac = s[s.length - 1];
br.close();
return ethMac;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
获取设备序列号:
String serial = Build.SERIAL;
获取设备生产厂商
String manufacturer = Build.MANUFACTURER;
五:获取设备当前时间
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
Date curData = new Date(System.currentTimeMillis());
String string_curtime = format.format(curData);
int int_curime = Integer.parseInt(string_curtime);
信息格式为yyyyMMdd(HHmmss)
获取毫秒信息:
System.currentTimeMillis();
获取时间为自1970年1月1日0时0分起到当前的毫秒数之差。
六:对于节省代码
if(flag)
return true;
else
return false;
等价于:
return flag;
七:访问网络权限
android:name="android.permission.ACCESS_NETWORK_STATE"/> //显示正在检测网络提示,防止用户继续start该线程 mProgressDialog = new ProgressDialog(NetworkInforActivity.this, R.style.dialog); mProgressDialog.setCancelable(false);//阻止用户执行其他操作,但无法阻塞home按键 mProgressDialog.setMessage(getString(R.string.router_test)); mProgressDialog.show(); 九:handle消息机制定义与对信息的处理 mHandler.sendEmptyMessage(MSG_NETWORK_UNWAN);//发送消息,参数为 (int)msg.what private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); Log.i(TAG, "接受信息为:" + msg.what); switch (msg.what) { case MSG_NETWORK_UNCONNECTED: mTvNetwork_type.setText("未连接"); mTvNetwork_state.setText("未连接"); mProgressDialog.dismiss(); showFaildDialog(); break; case MSG_NETWORK_ISETHERNET: mTvNetwork_type.setText("有线网络"); mProgressDialog.dismiss(); break; case MSG_NETWORK_UNETHERNET: mTvNetwork_type.setText("无线网络"); mProgressDialog.dismiss(); break; case MSG_NETWORK_ISWAN: mTvNetwork_state.setText("互联网"); mProgressDialog.dismiss(); break; case MSG_NETWORK_UNWAN: mTvNetwork_state.setText("局域网"); mProgressDialog.dismiss(); default: break; } } }; 十:显示AlertDialog,以及对其进行按键处理 private void showFaildDialog() { AlertDialog.Builder dialog = new AlertDialog.Builder(this, R.style.dialog); dialog.setTitle(R.string.router_disconnect); dialog.setCancelable(false); dialog.setPositiveButton(R.string.button_testagain, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { mProgressDialog.show(); new PingThread().start(); } }); dialog.setNegativeButton("取消检测", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { dialog.dismiss(); } }); dialog.show(); } 十一:判断网络是否连接 //判断网络是否连接 private boolean isNetConnected() { isconnected = false; ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); if (cm == null) { return false; } NetworkInfo[] infos = cm.getAllNetworkInfo(); if (infos != null) { for (NetworkInfo ni : infos) { if (ni.isConnected()) { isconnected = true; return true; } } } return false; } 十二:判断是否连接有线网络 //判断网络是否连接有线网络(Ethernet) private boolean isEthernetEnabled() { C onnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); if (cm != null) { NetworkInfo networkInfo = cm.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_ETHERNET) { isethernet = true; return true; } } isethernet = false; return false; } 十三:判断是否能够ping通互联网:返回0则通,否则不通 //判断是否能够ping通互联网:返回0则通,否则不通 public int isReachable(String remoteIpAddress, int pingTimes, double timeOut) { int result = 1; String pingCommand = "ping" + " -c " + pingTimes + " -i " + timeOut + " " + remoteIpAddress;//该语句遵循linux中ping命令规则 Runtime runtime = Runtime.getRuntime(); Process proc = null; try { proc = runtime.exec(pingCommand); result = proc.waitFor(); } catch (Exception e) { e.printStackTrace(); } if (result == 0) { isWAN = true; } else { isWAN = false; } return result; } 十四:显示进度圈,防止用户继续其线程start @Override public void onClick(View v) { //显示进度圈,防止用户继续其线程 start mProgressDialog = new ProgressDialog(NetworkInforActivity.this, R.style.dialog); mProgressDialog.setCancelable(false); mProgressDialog.setMessage(getString(R.string.router_test)); mProgressDialog.show(); new PingThread().start(); } 十五:下载文件 下载指定路径(url)文件到目标路径(newUrl) private void download(String url, String newUrl) { try { // 设置目标路径 URL productUrl = new URL(url); // 连接服务器 URLConnection connection = productUrl.openConnection(); // 设置连接超时时间 connection.setConnectTimeout(CONNECT_TIMEOUT); connection.setReadTimeout(READ_TIMEOUT); HttpURLConnection httpURLConnection = (HttpURLConnection) connection; logs("" + productUrl); logs("" + newUrl); int responseCode = httpURLConnection.getResponseCode(); logs("" + responseCode); if (responseCode != HttpURLConnection.HTTP_OK) { Log.e(TAG, "Connect Error" + url); return; } InputStream in = httpURLConnection.getInputStream(); logs("******begain download file:" + url); logs("******begain download file:" + newUrl); File f = new File(newUrl); f.createNewFile(); FileOutputStream fo = new FileOutputStream(f); byte[] buf = new byte[1024]; int len = 0; while ((len = in.read(buf)) != -1) { fo.write(buf, 0, len); } in.close(); fo.close(); downsuccess = true; Log.i(TAG, "downLoad success"); } catch (Exception e) { e.printStackTrace(); logs("downLoader failed"); } } 十六:解析json文件(android中使用,解析本地文件夹) private ArrayList ArrayList //ReadFile()可以将路径为newUrl路径的文件数据转换为String类型数据 String JsonContext = new FileToString().ReadFile(newUrl); try { JSONArray jsonObjs = new JSONObject(JsonContext).getJSONArray("apk"); for(int i = 0; i < jsonObjs.length() ; i++){ JSONObject jsonObj = (JSONObject)jsonObjs.opt(i); ApkInfo apkInfo = new ApkInfo(); apkInfo.setFile_name(jsonObj.getString("file_name")); logs("file_name = " + jsonObj.getString("file_name")); apkInfo.setPackage_name(jsonObj.getString("package_name")); logs("package_name = " + jsonObj.getString("package_name")); apkInfo.setVersionCode(Integer.parseInt(jsonObj.getString("versionCod e"))); logs("versionCode = " + Integer.parseInt(jsonObj.getString("versionCode"))); apkInfo.setVersionName(jsonObj.getString("versionName")); logs("versionName = "+ jsonObj.getString("versionName")); apkinfos.add(apkInfo); } } catch (JSONException e) { System.out.println("Jsons parse error !"); e.printStackTrace(); } return apkinfos; } public class FileToString { //将指定路径的文件转换为String类型,并返回 public String ReadFile(String Path) { BufferedReader reader = null; String laststr = ""; try { FileInputStream fileInputStream = new FileInputStream(Path); InputStreamReader inputStreamReader = new InputStreamReader( fileInputStream, "UTF-8"); reader = new BufferedReader(inputStreamReader); String tempString = null; while ((tempString = reader.readLine()) != null) { laststr += tempString; } reader.close(); } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } return laststr; } } 十七:解析服务器json文件,根据路径获取输入流并解析 /** * function: 解析json文件,其路径为newUrl,解析后将其存储到apkinfos中 * * @param newUrl * @param apkinfos * @return */ private ArrayList try { URL productUrl = new URL("http://172.16.163.1/app/apkinfo.json"); // 连接服务器 URLConnection connection = productUrl.openConnection(); // 设置连接超时时间 connection.setConnectTimeout(CONNECT_TIMEOUT); connection.setReadTimeout(READ_TIMEOUT); HttpURLConnection httpURLConnection = (HttpURLConnection) connection; int responseCode = httpURLConnection.getResponseCode(); logs("" + responseCode); if (responseCode != HttpURLConnection.HTTP_OK) { logs("connect error"); return apkinfos; } InputStream in = httpURLConnection.getInputStream(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); byte[] data = new byte[1024]; int len = 0; while ((len = in.read(data)) != -1) { outputStream.write(data, 0, len); } JSONArray jsonArray = new JSONObject(new String( outputStream.toByteArray())).getJSONArray("apk"); for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObj = (JSONObject) jsonArray.opt(i); ApkInfo apkInfo = new ApkInfo(); apkInfo.setFile_name(jsonObj.getString("file_name")); logs("file_name = " + jsonObj.getString("file_name")); apkInfo.setPackage_name(jsonObj.getString("package_name")); logs("package_name = " + jsonObj.getString("package_name")); apkInfo.setVersionCode(Integer.parseInt(jsonObj .getString("versionCode"))); logs("versionCode = " + Integer.parseInt(jsonObj.getString("versionCode"))); apkInfo.setVersionName(jsonObj.getString("versionName")); logs("versionName = " + jsonObj.getString("versionName")); apkinfos.add(apkInfo); } } catch (Exception e) { e.printStackTrace(); } return apkinfos; } 十八:获取所有已经安装的apk的信息 private ArrayList PackageManager packageManager = mContext.getPackageManager(); ArrayList List .getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES); for (int i = 0; i < pack.size(); i++) { ApkInfo apkinfo = new ApkInfo(); PackageInfo p = pack.get(i); String s = p.applicationInfo.sourceDir; Log.v("tag", p.applicationInfo.sourceDir); File file = new File(s); if (file.isFile()) { apkinfo.setFile_name("" + p.applicationInfo.loadLabel(packageManager)); logs("" + p.applicationInfo.loadLabel(packageManager)); apkinfo.setPackage_name(p.packageName); logs(p.packageName); apkinfo.setVersionCode(p.versionCode); logs(p.versionCode + ""); apkinfo.setVersionName(p.versionName); logs(p.versionName); apkinfos.add(apkinfo); } } return apkinfos; } 十九:安装apk,分为静默安装与非静默安装,静默卸载 /** * function:非静默安装,安装apkAbsolutePath处apk文件,路径含文件名 * @param apkAbsolutePath */ public void Install(String apkAbsolutePath) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File(apkAbsolutePath)), "application/vnd.android.package-archive"); mContext.startActivity(intent); } /** * function:静默安装,安装apkAbsolutePath处apk文件,路径含文件名 * @param apkAbsolutePath * @return */ //静默安装需要将该apk置于system/app下,并需要在源码环境下编译,与系统具有相同的签名方可 public String SilenceInstall(String apkAbsolutePath) { String[] args = { "pm", "install", "-r", apkAbsolutePath }; String result = ""; ProcessBuilder processBuilder = new ProcessBuilder(args); Process process = null; InputStream errIs = null; InputStream inIs = null; try { ByteArrayOutputStream byteArrayOutPutStream = new ByteArrayOutputStream(); int read = -1; process = processBuilder.start(); errIs = process.getErrorStream(); while ((read = errIs.read()) != -1) { byteArrayOutPutStream.write(read); } byteArrayOutPutStream.write("/n".getBytes()); inIs = process.getInputStream(); while ((read = inIs.read()) != -1) { byteArrayOutPutStream.write(read); } byte[] data = byteArrayOutPutStream.toByteArray(); result = new String(data); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (errIs != null) { errIs.close(); } if (inIs != null) { inIs.close(); } } catch (IOException e) { e.printStackTrace(); } if (process != null) { process.destroy(); } } return result; } //静默卸载 private boolean uninstallPkg(String packageName) { // Create new intent to launch Uninstaller activity // Uri packageURI = Uri.parse("package:" + packageName); // Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, // packageURI); // uninstallIntent.putExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, allUsers); // startActivity(uninstallIntent); try { //获取root权限 Process process1 = Runtime.getRuntime().exec("su"); Process process = Runtime.getRuntime().exec("pm uninstall "+packageName); Log.i("mytest", "packageName: "+"pm uninstall "+packageName); BufferedReader br = new BufferedReader(new InputStreamReader( process.getInputStream())); while(true){ String inline = br.readLine(); Log.i("mytest", "inline"+inline); if(inline.equals("Sucess")){ return true; } else if(inline.equals("Failed")){ return false; } } } catch (Exception e) { return false; } } 二零:发送与接收广播 发送: intent.setAction("https://www.360docs.net/doc/7311893835.html,mon.CHECK_UPDATE"); context.sendBroadcast(intent); 接收广播: public class MyBroadcast extends BroadcastReceiver{ static final private String TAG = "Updatecheck"; @Override //接收到广播后执行以下操作,可以通过intent传递数据 public void onReceive(Context context, Intent intent) { Log.i("check", "onreceive"); boolean needUpdate = intent.getBooleanExtra("needCheck", false); String apkUrl = intent.getStringExtra("apkUrl"); String packageName = intent.getStringExtra("packageName"); logs("该应用需要被更新"); if (needUpdate) { logs(apkUrl); DownloadAndInstall mDownloadAndInstall = new DownloadAndInstall(context); mDownloadAndInstall.downloadandinstall(context, packageName, apkUrl,true); } } public void logs(String s) { boolean b = true; if (b) { Log.i(TAG, s); } } } 静态广播注册: 二一:java中解析JSON文件 import net.sf.json.JSONArray; import net.sf.json.JSONObject; JSONArray jsonArray = JSONArray.fromObject(new String(outputStream.toByteArray())); int size = jsonArray.size(); System.out.println("Size: " + size); for (int i = 0; i < size; i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); System.out.println("[" + i + "]file_name=" + jsonObject.get("file_name")); System.out.println("[" + i + "]name=" + jsonObject.get("package_name")); System.out.println("[" + i + "]versionCode=" + jsonObject.get("versionCode")); } 需要导入jar包: commons-beanutils-1.8.3.jar commons-collections-3.2.1.jar commons-lang-2.5.jar commons-logging-1.1.1.jar ezmorph-1.0.6.jar json-lib-2.3-jdk15.jar 二二:获取文件列表 package com.example.test_listfile; import java.io.File; import java.util.ArrayList; import java.util.List; import android.os.Bundle; import android.app.AlertDialog; import android.app.ListActivity; import android.content.DialogInterface; import android.util.Log; import android.view.View; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; public class MainActivity extends ListActivity { /** Called when the activity is first created. */ private List private List private String rootPath = "/"; // private String rootPath = Environment.getDataDirectory().toString(); private TextView tv; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.360docs.net/doc/7311893835.html,yout.activity_main); tv = (TextView) this.findViewById(R.id.TextView); this.getFileDir(rootPath);// 获取rootPath目录下的文件. } public void getFileDir(String filePath) { Log.i("file name", filePath); try { https://www.360docs.net/doc/7311893835.html,.setText("当前路径:" + filePath);// 设置当前所在路径 items = new ArrayList paths = new ArrayList File f = new File(filePath); File[] files = f.listFiles();// 列出所有文件 // 如果不是根目录,则列出返回根目录和上一目录选项 if (files == null) { Log.i("null_files", f.getPath()); } if (!filePath.equals(rootPath)) { items.add("返回根目录"); paths.add(rootPath); items.add("返回上一层目录"); paths.add(f.getParent()); } // 将所有文件存入list中 if (files != null) { int count = files.length;// 文件个数 for (int i = 0; i < count; i++) { File file = files[i]; items.add(file.getName()); paths.add(file.getPath()); } } ArrayAdapter this.setListAdapter(adapter); 想要学习移动应用的开发,除了必备的知识要掌握好之外,更多的是要掌握一些核心的基础知识,并且是能够起到关键性作用的知识点,必须是要了解清楚,如果你也是在学习Android开发,下面的核心基础或者对你有一定的帮助! 1.ListView的引入 为什么要采用listview?其实是在数据量过于庞大时,传统的存储方式它是会占用机器大量内存,最终导致OOM异常(内存溢出),listview的出现将会是有效的解决这个弊端的出现。 重点来了listview如何使用呢? res/layout布局文件中定义listview src的java代码里面关心控件findviewbyid(R.id.listview); 创建适配器对象,适配器继承baseAdapter接口 2.构造方法 getCount();控制listview的条目数 getView();得到当前条目视图 View.inflate();布局填充器 设置适配器:setAdapter(adapter); 设置listview列表项的点击事件:setOnClickLinsstener(); 通知listview更新数据:adapter.notifyDataSetChanged(); 3.对话框的使用 *普通对话框 *单选对话框 *多选对话框 *进度对话框 *进度条对话框 *自定义对话框 布局填充器:Viewview=View.inflate(Context,https://www.360docs.net/doc/7311893835.html,yout.dialog,null); 核心API:dialog.setView(view); 4.常见的一些适配器的使用 *数组适配器:ArrayAdapter *简单适配器:SimpleAdapter 5.数据库的常见的事务 为什么需要需要定义数据库事务?最主要的还是为了保证多条操作语句同步执行 6.数据库事务执行流程 db.beginTransaction();开启事务 db.setTransactionSuccessful();设置事务执行成功 db.endTransaction();结束事务 7.样式和主题 样式的作用在单独的UI控件上面 主题的作用它是在activity或者application上 以上的这些功能控件、数据库等这些是开发中必备的功能,在开发中只要这些基本的核心知识都掌握了,那么这对你接下里的进一步开发是比较有帮助的。 Android Activity Visible Fragment addview setContentView startActivity startActivityForResult requestCode ResponseCode setResult(intent, response code) onActivityResult Service start onCreate() onStartCommand() onDestroy bind onCreate() onBind() onUnbind() onDestroy ServiceConnection onServiceConnected() &!null binder onServiceDisconnected() been killed crash BroadcastReceiver XML manifest intent-filter Code registerReceiver(receiver, filter)unRegistReceiver() code sendBroadcast(intent) SendOrderedBroadcast Android应用开发基本知识点汇总 Activity 一生命周期 4种状态 running / paused / stopped / killed 生命周期 Activity启动 onCreate -> onStart -> onResume 点Home返回主界面 onPause -> onStop 再次回到原Activity onRestart -> onStart -> onResume 退出Activity onPause -> onStop -> onDestroy 进程优先级前台/可见/服务/后台/空 二任务栈 三启动模式 standard singleTop 栈顶复用 singleTask 栈内复用 singeInstance 四scheme跳转协议 服务器可以定制化告诉App跳转哪个页面,可以通过通知栏消息定制化跳转页面,可以通过H5页面跳转页面 Fragment 一第五大组件 为什么是第五大组件 Fragment相对Activity更节省内存,切换更舒适Fragment加载到Activity的两种方式 静态加载xml 动态加载fragmentTransaction.add(id, fragment, “name”); .commit; FragmentPagerAdapter与FragmentStatePagerAdapter FragmentStatePagerAdapter在切换时回收内存,适合页面较多的情况FragmentPagerAdapter并没有回收内存,只是detach了Activity 二生命周期 onAttach -> onCreate -> onCreateView -> onViewCreated -> onActivityCreated -> onStart -> onResume -> onPause -> onStop -> onDestroyView -> onDestroy -> onDetach 先创建Activity后创建Fragment,先销毁Fragment后销毁Activity 三Fragment之间的通信 Fragment调用Activity getActivity Activity调用Fragment 接口回调 Fragment调用Fragment方法findFragmentById 四FragmentManager replace add remove Service 一应用场景,与Thread区别 Service是什么后台长时间运行,没有用户界面,运行在主线程,不能有耗时操作 Service与Thread区别 Activity难以与Thread交互,尤其当Activity销毁以后 二开启Service的两种方式 StartService onCreate -> onStartCommand -> onBind -> onDestroy onStartCommand return START_STICKY; 比如:计算WVGA(800*480)分辨率,3.7英寸的密度DPI 图1 Diagonal pixel 表示对角线的像素值(=),DPI=933/3.7=252 3.手机屏幕的分类 3.1根据手机屏幕密度(DPI)或屏幕尺寸大小分为以下3类,如图2所示 图2 3. 2手机屏幕分类和像素密度的对应关系如表1所示: 图3 从以上的屏幕尺寸分布情况上看,其实手机只要考虑3-4.5寸之间密度为1和1.5的手机4 UI设计 从开发角度讲,应用程序会根据3类A ndroid手机屏幕提供3套UI布局文件,但是相应界面图标也需要提供3套,如表2所示 需要根据物理尺寸的大小准备5套布局,layout(放一些通用布局xml文件,比如界面中顶部和底部的布局,不会随着屏幕大小变化,类似windos窗口的title bar),layout- small(屏幕尺寸小于3英寸左右的布局),layout-normal(屏幕尺寸小于4.5英寸左右),layout-large(4英寸-7英寸之间),layout-xlarge(7-10英寸之间) 2)图片资源方面 需要根据dpi值准备5套图片资源,drawable,drawalbe-ldpi,drawable-mdpi,drawable-hdpi,drawable-xhdpi Android有个自动匹配机制去选择对应的布局和图片资源 分享到:?上一篇:分享摩托罗拉milestone手机升级到Android 2.2的过程 ?下一篇:基于feng streaming server 搭建Android直播测试平台 查看评论 7楼pc0de 2011-12-16 17:11发表[回复] 谢谢分享啊 6楼yang_hui198**** ****-11-19 16:44发表[回复] 很强大!!!很喜欢!!! 3楼noICE1 2011-08-16 14:59发表[回复] 1、关于android进程,说法不正确的是( B ) A、组件运行所在的进程,是由androidManifest.xml决定,它可以指定该组件运行于哪个进程。 B、背景进程是不为用户所见的Activity,但是还会有可能被用户看到,所以它不能被杀死 C、当急需内存时,android会决定优先关闭那些空闲的进程 D、可视进程一般不会不被系统所杀死 2、Matrix类的作用( A ) A、可以存储缩小或放大比列 B、存储文件中的图片信息 C、存储资源中的图片信息 D、存储内存中的图片信息 3、关于主题的说法,错误的是( D ) A、它是属性集合 B、它可以在程序中来设置 C、它通常用于一个Activity或所有Activity上 D、它可以用于单个TextView上 4、setOnTouchEvent 设置返回值为true 和 false有何区别?以下说法较准确是( C ) A、没有区别,都能对事件进行监听 B、设置为true时只能在移动时获得一次监听事件,false则可以多次 C、设置为false是,在处理一次监听事件后,系统将抛弃该次事件 D、返回true表示这个消息已经被处理结束,后续的handler不再接收到这个消息 二、开发技术设计与应用能力部分 注:以下程序均是相关程序或小项目的实现代码,根据每个程序或项目的特性,完成程序空缺部分的内容,使其实现。具体程序代码注释省略。 图1 图2 图3 图4 1)电话实现[主界面如图1] 程序描述:完成手机打电话功能。 public class MainActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.360docs.net/doc/7311893835.html,yout.activity_main); Button btn_call = (Button)this.findViewById(R.id.btn_call); btn_call.setOnClickListener(new btnCall()); } private class btnCall implements OnClickListener (1) { public void onClick(View v) { // TODO Auto-generated method stub EditText et_number = (EditText) MainActivity.this.findViewById(R.id.et_number); String s_number = et_number.getText().toString().trim(); (2) Intent i_call = new Intent(); i_call.setAction(Intent.ACTION_CALL(3)); i_call.setData(Uri.parse("tel:"+s_number)); startActivity(i_call); (4) } } } 2)动画实现[主界面如图2] 程序描述:手机屏幕触摸后演示动画,假设XML文件已经设置好,id资源为:R.drawable.panda public class MainActivity extends Activity { ImageView iv_action; AnimationDrawable ad_action; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.360docs.net/doc/7311893835.html,yout.activity_main); iv_action = (ImageView)this.findViewById(R.id.iv_action); iv_action.setBackgroundResource(5)(R.drawable.panda); ad_action = (AnimationDrawable) iv_action.getBackground(); } public boolean onTouchEvent(MotionEvent event) { ad_action.start();(6) return super.onTouchEvent(event); } } 3)撕衣服游戏实现 项目描述:划动屏幕时完成撕衣服效果,并产生撕衣服声音(sound.mp3) public class MainActivity extends Activity { ImageView iv_upper; ImageView iv_below; 1.课程基本信息 课程编号:M21F58D10 课程名称:Android应用与开发 开设学期:第3学期 总学时:60 总学分:4 课程类别:岗位能力课程课程性质:必修课 适用专业:软件技术(移动应用开发) 责任单位:计算机与软件学院 2.课程定位 《Android应用与开发》课程是软件技术(移动应用开发方向)专业的岗位能力课程,课程的开设依据是软件技术专业人才培养目标和相关职业岗位(群)的能力要求,对本专业所面向的手机软件开发与测试、软件开发与项目管理等岗位所需要的知识、技能和素质目标的达成起支撑作用。 在课程设置上,前导课程有《Java程序设计》(M21F1611),《数据结构》(M21F232),后续课程有《移动互联网开发综合实训》(M21J57B10)、《毕业实习》(M21J991)。 3.课程设计思路 首先依据专业人才培养方案中关于人才培养目标的阐述,明确课程目标;其次,结合职业教育课程观、教学观、能力观,基于软件工程的开发过程,以项目化教学来组织课程内容,在课程内容的选择与排序中,以软件项目研发的不同阶段、典型任务为载体,将课程内容划分为互相联系的学习情景;第三,通过对各学习情景中学习目标、主要内容、授课方式、师生要求等各项内容的描述,来规范课程所要求的内容;第四,通过对课程内容的选取和组合,以一个完整的项目为载体,完成课程的实施;最后,通过对项目实施过程中各个环节的考察和评价,来完成对课程的评鉴与考核。 本课程在设计上本着懂方法,重应用的总体思路,突出体现职业教育的技能型、应用性特色,着重培养学生的实践应用技能,力求达到理论方法够用,技术技能过硬的目的。 4.课程建设基本理念 本课程按照理论实践一体、课内外互补、课堂教学与培优工程相结合的课程设计指导思想,以任务或项目为载体组织教学内容,突出学生的主体地位,实现“教、学、做”的有机融合;通过班级讲授、团队学习、个体辅导、展示交流、技能大赛等手段,实现从模仿到应用到创新的高职学生递进式培养。 本课程强调对学生职业岗位能力的培养和职业素养的养成,针对不同环节,采用特定的教学方法,有意识、有步骤地将职业能力的训练和职业素养的形成融入到实际的教学过程中。 项目总结 时间过的好快,为期三个月的实训生活即将结束了,每一次的实训我们都受益匪浅,我 们学到的不仅仅是课内还有课外,实训让我们的课内知识得到了巩固,专业知识、编程水平 都有很大的提高,我们非常感谢这次实训。 刚开始二周的高强度的课程安排让我们受益匪浅;接下来的项目实训又让我们可以巩固 了课程。这让我觉得实习生活充实而有意义。 乐淘购物项目和android优化大师,我更好的学习了ui的设计,如何使界面漂亮,美观, 巩固了listview,gridview,的使用,学会了动画进入界面的,和会移动的画廊等等。在这 两个项目中,除了让我明白工作中需要能力,素质,知识之外,更重要的是学会了如何去完 成一个任务,懂得了享受工作。当遇到问题,冷静,想办法一点一点的排除障碍,到最后获 取成功,一种自信心由然而生,这就是工作的乐趣。有时候也需要虚心请教,从别人的身上 真得能学习到不自己没有的东西,每一次的挫折只能使我更接近成功。 音乐播放器项目,我们是七个人组成小组完成的,由组长带领我们,分配任务,每个人, 都发挥自己的长处,更好地去完成任务。对于团队开发来说,团结一致使我深有体会。团队 的合作注重沟通和信任,不能不屑于做小事,永远都要保持亲和诚信,把专业理论运用到具 体实践中,不仅加深我对理论的掌握和 运用,还让我拥有了一次又一次难忘的开发经历,这是也是实训最大的收获。 这次实训对于我以后学习、找工作也真是受益菲浅,在这3个月中让我初步从理性回到 感性的重新认识,也让我初步的认识这个社会,对于以后做人所应把握的方向也有所启发! 相信这些宝贵的经验会成为我今后成功的重要的基石。在此,我非常感谢指导老师和 同学对我的帮助。篇二:android实训报告 通信与电子信息专业实训报告 项目名称:基于android的游戏开发 班级 10通信1班 姓名 学号 指导教师 成绩 实训时间:年月日— 目录 一、实训目的及其意义 (3) 1.1、目的及意义 (3) 1.2、研究现状 (3) 二、实训主要任务、重点及难点 (4) 2.1、任务 (4) 2.2、重点内容及实现途径 (4) 三、实训具体内容及完成的主要工作 (5) 3.1、认识基础开发 (6) 3.2、了解数据存储 (6) 3.3、总体实训过程 (7) 四、实际遇到的困难,解决问题的方法和措施 (8) (一)、所遇问题 (8) (二)、解决方法与措施 (9) 五、心得体会 (9) 1、Intent的Component属性的作用是什么,如何定义此属性? component(组件),指定Intent的的目标组件的类名称。通常Android会根据Intent 中 包含的其它属性的信息,比如action、data/type、category进行查找,最终找到一个与之匹 配的目标组件。但是,如果component这个属性有指定的话,将直接使用它指定的组件, 而不再执行上述查找过程。指定了这个属性以后,Intent的其它所有属性都是可选的。Component属性的作用是用来指定Intent的目标组件的类名称。如果Component这个属性被指定了的话,Intent的其它属性都是可选项,Android 会直接使用Component指定目标组件,而不再执行其它查找过程。 在使用时,需要先创建一个ComponentName对象,然后将它设置成Intent对 象的Component的属性。通过setComponent()、setClass()和setClassName() 三种方法都可以设置组件的名称,通过getComponent()方法则可获得设置项。 2、发送广播时,可以通过sendCatagoryBroadcast()方法将Intent对象发送出去( ). (错) 3、Android是什么?( ) 一种操作系统 4、下面关于Android dvm的进程和Linux的进程,应用程序的进程说法正确的是( ) DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念。 5、Android操作系统最早由哪个公司研发?( ) Android公司 6、下列中不属于手持设备的是( ) 机顶盒 7、下列不是手机操作系统的是()。Windows Vista 8、到目前为止,Android操作系统的最高版本是哪个?( )Android L 9、安装Android SDK时,可以通过( )在线安装或离线安装。Android sdk manager 10、开发Android应用程序时,一般使用的计算机语言是( ) 。JAVA 11、E/AndroidRuntime(1099): https://www.360docs.net/doc/7311893835.html,ng.RuntimeException: Unable to instantiate activity ComponentInfo{com.test/com.test.CanvasActivitys}: https://www.360docs.net/doc/7311893835.html,ng.ClassNotFoundException: com.test.CanvasActivitys in loader dalvik.system.PathClassLoader[/data/app/com.test-1.apk] 这段话是程序报错在LogCat中产生的记录,从中可以分析问题的原因可能在哪里?( ) CanvasActivitys类没有在AndroidManifest中正确申明 12、对于直接Intent,Android不需要去做解析,因为目标组件已经很明确,Android 需要解析的是那些间接Intent,通过解析,将Intent映射给可以处理此Intent的Activity、IntentReceiver或Service (对) Intent 可以传递View对象(错) Intent起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被 调用者之间的解耦(对) 通过Intent可以删除程序(对) 13、下面退出Activity错误的方法是()。System.exit( ) 14、当启动一个Activity并且新的Activity执行完后需要返回到启动它的Activity来执行 的回调函数是( )。startActivityResult() 15、这是一个资源配置文件,下面描述正确的是? ( )这个shape文件是画一条虚线,实 线段5dp,间隔3dp 16、Toast toast = new Toast(this); toast.setText("今天天气不错\n哈哈"); toast.show(); 上面代码的执行结果是什么( )。代码会抛出异常,因为new出的Toast对象不能再使用setText方法来设置提示框文本 基本概念 为了方便后边的编程,我们第一篇文章主要是介绍一些关于OpenGLES基本的概念。点 3D图像的最小单位称为点(point)或者顶点vertex。它们代表三维空间中的一个点并用来建造更复杂的物体。多边形就是由点构成,而物体是由多个多边形组成。尽管通常OpenGL支持多种多边形,但OpenGLEs只支持三边形(即三角形)所以即使我们要绘制一个正方形也要把它拆分为两个三角形绘制。先说说坐标系的问题。 默认情况下,以屏幕中心为坐标轴原点。原点左方x为负值,右边为正值。原点上方y 为正,原点下方为负。垂直屏幕向外为z正,垂直屏幕向里为z负。默认情况下,从原点到屏幕边缘为1.0f,沿各轴增加或减小的数值是以任意刻度进行的–它们不代表任何真实单位,如英尺,像素或米等。你可以选择任何对你的程序有意义的刻度(全局必须保持单位一致,不能一部分使用米,一部分使用像素)。OpenGL只是将它作为一个参照单位处理,保证它们具有相同的距离。如图: 了解了坐标轴,我们来看看怎么在坐标系中表示一个点,通常用一组浮点数来表示点。例如一个正方形的4个顶点可表示为: 1.float vertices[] ={ 2.-1.0f,1.0f,.0f,//左上 3.-1.0f, -1.0f,.0f,//左下 4.1.0f, -1.0f,.0f,//右下 5.1.0f,1.0f,.0f,//右上 6.}; 为了提高性能,通常还需要将浮点数组存入一个字节缓冲中。所以有了下面的操作: 1.ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length *4); //申请内存 2.vbb.order(ByteOrder.nativeOrder()); //设置字节顺序,其中ByteOrder.nativeOrder()是 获取本机字节顺序 3.FloatBuffer vertexBuffer = vbb.asFloatBuffer(); //转换为float型 合肥工业大学学生自主实习报告 学号: xxx 姓名: xxx 实习单位: 实习时间:2014年6月22-7月5日 一、实习目的: 1、掌握android系统开发的一些常用知识 2、拥有独立解决开发中遇到问题的能力 3、熟悉android软件开发流程并至少做一个android软件项目。 了解现阶段互联网发展主流,了解移动互联网,认识移动互 联网的发展与展望,认识Android,了解基于Android的应用软件开发方法及其商业流程。把理论与实际结合,通过对理论知识的理解,领悟从而运用到生活实际巩固所学的知识,提高对实际生活的认识,积累经验。使学生在此期间能够初次体会到实际生产中的种种技能与经验,完成一项项目锻炼独立思考及团队合作能力。使学生们进一步加深对所学知识的理解,理论联系实际,巩固所学有关计算机基础理论知识和基本技能,学习有关计算机最新技术方面的应用,增强学生对计算机在社会生活,社会生产中应用的感性认识,深入了解计算机在各个领域中的应用状况。生产实习是学校教学的重要补充部分,是区别于普通学校教育的一个显著特征,是教育教学体系中的一个不可缺少的重要组成部分和不可替代的重要环节。它是与今后的职业生活最直接联系的,学生在生产实习过程中将完成学习到就业的过渡,因此生产实习是培养技能型人才,实现培养目标的主要途径。它不仅是校内教学的延续,而且是校内教学的总结。生产实习一方面巩固了书本上学到的理论知识,另一方面,可获得在书本上不易了解和不易学到的生产现场的实际知识,使我们在实践中得到提高实训环节对于提高学生的综合能力和全面素质具重要意义 二、实习单位:苏州高博培训 Android应用程序开发是以Java语言为基础的,所以需要有扎实的Java基础知识。首先熟悉java基本语法,然后熟悉设计模式等。 a) Java基础语法:看下面的《Java知识点列表》 b)设计模式:由于在Android系统的框架层当中,使用了大量的设计模式,如果没有这个方面的知识,对于Android的理解就会大打折扣。设计模式的种类非常之多(设计模式大概有28种,具体请看设计模式系列),一个一个的全部掌握,是不现实的,必须首先掌握面向对象的基础设计原则,有了这些基础原则的支持,理解android容易很多。 有了这些知识,然后再来学习Android开发,一定会事半功倍。 《Java知识点列表》:这些是别人总结,我只是加些说明。 开发环境: 1 Java SDK 下载和安装 2 环境变量的配置(path和classpath) 编程基础: 3. 标识符命名规范 4 Java数据类型 5 运算符 6 分支语句(if,switch) 7 循环语句(for,while) 8 函数的定义方法 只要是个程序员,都懂。语言之间可以融会贯通。 面向对象基础: 向对象的三个基本特征是:封装、继承、多态 9. 面向对象与面向过程语言之间的区别 10 面向对象基本思想(封装) 封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏 11 类的定义方法 12 对象和类的关系 13 对象的创建方法 14 通过对象使用成员变量和成员函数的方法 15 构造函数的作用 16 函数的重载 17 static 的作用 18 this的作用 面向对象高级: 19 面向对象基本思想(继承) 继承:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进 Android平台介绍及使用指导 二○一○年二月 版本 1.0 目录 Android平台介绍 ................................................................................... - 4 -基本名词...................................................................................................................... - 5 - 操作方法介绍 .......................................................................................... - 6 - 手机按键介绍.............................................................................................................. - 6 - 快捷键介绍.................................................................................................................. - 6 - 信息功能介绍.............................................................................................................. - 7 - 联系人功能介绍........................................................................................................ - 11 - 通话记录功能介绍.................................................................................................... - 14 - 文本粘贴/复制功能介绍.......................................................................................... - 14 - Push Email(Moxier)功能介绍............................................................................ - 15 - 电子邮件功能介绍.................................................................................................... - 16 - 桌面功能介绍............................................................................................................ - 19 - 蓝牙功能介绍............................................................................................................ - 23 - Wifi功能介绍........................................................................................................... - 23 - 飞行模式功能介绍.................................................................................................... - 23 - CDMA数据链接介绍................................................................................................... - 24 - 黑屏解锁功能............................................................................................................ - 25 - 回复出厂设置............................................................................................................ - 26 - 应用程序设置............................................................................................................ - 26 - GPS设置..................................................................................................................... - 27 - 手机中英文语言切换................................................................................................ - 28 - 更换手机输入法........................................................................................................ - 29 - 数据线链接Android手机........................................................................................ - 29 - 手机测试模式进入方法............................................................................................ - 30 - 横屏显示介绍............................................................................................................ - 30 - 浏览器功能介绍........................................................................................................ - 31 - RSS功能介绍............................................................................................................ - 32 - Q/A- 34 - Android架构基本知识 1.2 Android的系统架构 系统构架图中可以看到从上到依次是应用层(Applications)、应用框架层(Application Framework)、系统运行库层(Lib和Runtime)、 Linux内核层(linux kernel) 1.2.1 Android内核 Linux 内核版本2.6 位于硬件和软件堆之间的抽象层 核心服务:安全机制、内存管理、进程管理、网络、硬件驱动。 Android依赖Linux内核2.6来提供核心服务,比如进程管理、网络协议栈、硬件驱动。在这里,Linux内核作为硬件层和系统软件栈层之间的一个抽象层。这个操作系统并非类GNU/Linux的,因为其系统库,系统初始化和编程接口都和标准的Linux系统是有所不同的。 从Google目前release的Linux系统来看,其没有虚拟内存文件系统,系统所用的是yaffs2文件系统,具体的映像也都位于SDK安装目录下。通过emulator -console命令,我们可以在host 终端下得到一个简单的可以控制Android的shell,这个系统包含了一个Toolbox,提供一些基本的命令工具,集中在/sbin,/system/sbin,/system/bin中,但是很简陋,命令种类也很少。若有时间和必要我会作个介绍。 既然采用的linux系统,就有必要介绍一下主要驱动(如图中所示): 显示驱动(Display Driver) 键盘驱动(KeyBoard Driver) Flash内存驱动(Flash Memory Driver) 照相机驱动(Camera Driver) 音频驱动(Audio Driver) 蓝牙驱动(Bluetooth Driver) Wifi驱动 Binder IPC驱动 Power Management (电源管理)等等。 1.2.2程序库和运行库(Lib和Runtime) android(Google公司开发的操作系统) Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。Android操作系统最初由Andy Rubin开发,主要支持手机。2005年8月由Google收购注资。2007年11月,Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。随后Google以Apache 开源许可证的授权方式,发布了Android的源代码。第一部Android智能手机发布于2008年10月。Android逐渐扩展到平板电脑及其他领域上,如电视、数码相机、游戏机等。2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。2013年的第四季度,Android平台手机的全球市场份额已经达到78.1%。[1] 2013年09月24日谷歌开发的操作系统Android在迎来了5岁生日,全世界采用这款系统的设备数量已经达到10亿台。2014第一季度Android平台已占所有移动广告流量来源的42.8%,首度超越iOS。但运营收入不及iOS。 编程语言 C/C++(底层)Java等(应用层) 系统家族 类Unix,Linux 源码模式 自由及开放源代码软件 内核类型 宏内核(Linux内核) 软件许可 Apache License、GPL等 1系统简介编辑 Android一词的本义指“机器人”,同时也是Google于2007年11月5日 Android logo相关图片(36张) 宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成。 Android一词最早出现于法国作家利尔亚当(Auguste Villiers de l'Isle-Adam)在1886年发表的科幻小说《未来夏娃》(L'ève future)中。他将外表像人的机器起名为Android。Android的Logo是由Ascender公司设计的,诞生于2010年,其设计灵感源于男女厕所门上Android开发的核心知识
Android知识体系思维导图
Android应用开发基本知识点汇总
Android手机分辨率基础知识(DPI_DIP计算)
复习材料《Android移动应用开发技术》
android课程介绍
ANDROID实训心得体会
Android期末复习题总结
ANDROID OPENGL ES 基础知识(基本概念)
Android实习报告
android开发需要掌握的知识点
Android平台介绍及使用指导
Android架构基本知识
1.android发展历程简介