之前去笔试的时候,吃了很多细节的亏,《第一行代码Android》是我接触的第二本书(向本书作者郭霖大神致敬),当初看的时候只追求懂了,而没有去看细节,所以就。。。。
废话少说,开始:
1、2003年10月,Andy Rubin等人创办Android公司,2005年8月被谷歌收购,Andy Rubin继续负责。2008年9月,谷歌正式发布了Android1.0系统(最早版本)。
2、Android系统架构(四层架构,五块区域):
1,Linux内核层:这一层为Android设备的各种硬件提供了底层的驱动
2,系统运行库层:这一层通过一些C/C++库来为Android系统提供了主要的特性支持。(SQLite库提供了数据库的支持,OpenGL|ES库提供了3D绘图的支持,Webkit库提供了浏览器内核的支持等)
3,应用框架层:这一层主要提供了构建应用程序时可能用到的各种API。
4,应用层:所有安装在手机上的应用程序都是属于这一层的。
图片来源于这里
3、Android系统本身提供的:
四大组件:Activity、Service、BroadcastReceiver、ContentProvider
控件
Sqlite数据库
定位
多媒体
传感器
4、开发环境:
Android SDK :谷歌提供的Android开发工具包,有相关的API
Eclipse/AS :你需要的
ADT:全称Android Development Tools,插件。可联机调试
5、搭建开发环境:这里(笔试面试会涉及到这个吗?)
6、程序目录(不太关注的):
assets :主要存放一些随程序打包的文件,在程序运行时可以动态的读取到这些文件的内容。
project.properties:SDK版本
7、AndroidManifest.xml
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
这两个是项目的主活动
8、Log日志
9、隐藏标题栏:
requestWindowFeature(Window.FEATURE_NO_TITLE);
于setContentView(R.layout.xx)之前执行
10、销毁一个Activity:finish()
11、显式Intent,上去直接干;隐式Intent,还要指定action和category
12、Uri.parse():将一个网址字符串解析成一个Uri对象;
setData() :它接收一个Uri对象,主要用于指定当前Intent正在操作的数据。
13、Intent传递数据:
String data="Hello";
Intent intent=new Intent(FirstActicity.this,SecondActivity.class);
intent.putExtra("data",data);
startActivity(intent);
----------------------------------------------------------------------------------------
Intent intent=getIntent();
String data=intent.getStringExtra("data");
14、Intent返回数据给上一个Activity:
Intent intent=new Intent(MainActivity.this,OtherActivity.class);
startActivityForResult(intent, 1);
覆写方法onActivityResult
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == 2) {
if (requestCode == 1) {
result.setText(data.getStringExtra("tree"));
}
}
}
-------------------------------------------------------------------------------------------------------------
Intent intent=new Intent();
String tree=“hello”;
intent.putExtra("tree",tree);
setResult(2, intent);
15、 Activity的生命周期:
详解http://blog.csdn.net/liuhe688/article/details/6733407
16、onSaveInstanceState()
该方法保证一定在活动被回收之前调用,可以保存临时数据
代码中加入该回调方法
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
String tempData = "Hello";
outState.putString("data", tempData);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(savedInstanceState!=null){
String tempData=savedInstanceState.getString("data");
}
}
17、Activity的启动模式:
standard:默认,正常的栈活动
singleTop:与上不同,如果栈顶已是当前Activity,则直接使用,而不创建新的实例
singleTask:检索栈,同时出栈该实例在栈上的所有实例
singleInstance:启用一个新栈来管理当前Activity
手画图:
18、如何一次性销毁多个Activity(之前自己就没细看这一段,吃亏了。。。),看这里
19、 visibility属性VISIBLE、INVISIBLE、GONE的区别:
可见(visible)
XML文件:android:visibility="visible"
Java代码:view.setVisibility(View.VISIBLE);
不可见(invisible)
XML文件:android:visibility="invisible"
Java代码:view.setVisibility(View.INVISIBLE);
隐藏(GONE)
XML文件:android:visibility="gone"
Java代码:view.setVisibility(View.GONE);
详解: http://blog.csdn.net/chindroid/article/details/8000713/20、AlertDialog:
通过AlertDialog.Builder来创建AlertDialog的实例,
调用setPositiveButton()方法设置确定
调用setNegativeButton()方法设置取消
调用show()方法显示
ProgressDialog则是通过本身创建实例(大部分相同,调用dismiss()关闭)
21、布局
LinearLayout:线性布局
RelativeLayout:相对布局,通过相对定位的方式,让控件出现在布局的任何位置
FrameLayout:绝对布局,左上角布局
TableLayout:表格布局
22、引入布局:
<include layout="@layout/xx"/>
23、自定义控件:我就认
爱哥,一个系列下来,就差不多了
24、ListView:这个没什么好说的,而且RcyclerView已经出现了,看这里, 鸿洋大神
25、Fragment
生命周期:
addToBackStack模拟返回栈(一般传入null即可)
Fragment与Activity之间通信:
Activity中:
RightFragment rightFragment=(RightFragment) getFragmentManager().findFragmentById(R.id.xx);
Fragment中:
MainActivity activity=(MainActivity) getActivity();
体验Fragment的生命周期,不满足?再来一个
深入的话,鸿洋大神
26、Git项目托管,版本控制,看这里(像我个人平时做的小项目,一般都是Demo形式,都不够格用这个,就当自己给自己加分吧)
27、广播:(四大组件之一)
a、动态注册广播(普通广播、本地广播):在代码中干
b、静态广播:配置文件中干
28、数据存储
a、文件存储
存:
public void save(String inputText) {
FileOutputStream out = null;
BufferedWriter writer = null;
try {
out = openFileOutput("data", Context.MODE_PRIVATE);
writer = new BufferedWriter(new OutputStreamWriter(out));
writer.write(inputText);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (writer != null) {
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
取:
public String load() {
FileInputStream in = null;
BufferedReader reader = null;
StringBuilder content = new StringBuilder();
try {
in = openFileInput("data");
reader = new BufferedReader(new InputStreamReader(in));
String line = "";
while ((line = reader.readLine()) != null) {
content.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return content.toString();
}
http://m.blog.csdn.net/article/details?id=52145532
http://m.blog.csdn.net/article/details?id=52150853
b、ShapedPrepference
public class MainActivity extends Activity {
private EditText et;
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et = (EditText) findViewById(R.id.et);
btn = (Button) findViewById(R.id.btn);
// 读取
// SharedPreferences sp = getSharedPreferences("info",
// Context.MODE_PRIVATE);
// String new_msg = sp.getString("msg", "");
// et.setText(new_msg);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 写入
String msg = et.getText().toString();
// 获取SharedPreferences对象
// 参数1:根据name来获取对象的SharedPreferences对象,如果存在,就获取,如果不存在,就创建
// 参数2:指定打开模式
SharedPreferences sp = getSharedPreferences("info",
Context.MODE_PRIVATE);
// 获取编辑器
Editor edit = sp.edit();
// 存值
edit.putString("msg", msg);
// 提交,如果没有操作,那么以上所有内容都没意义
edit.commit();
}
});
}
}
http://blog.csdn.net/xiey94/article/details/51074616
c、SQLite
http://blog.csdn.net/xiey94/article/details/51089209
29、adb
adb是Android SDK中自带的一个调试工具,使用这个工具可以直接对连接在电脑上的手机或模拟器进行调试操作。它存放在sdk的platform-tools目录下,如果想要在命令行中使用这个工具,就需要先把它的路径配置到环境变量里。
WIndow:我的电脑-属性-高级-环境变量-系统变量-Path,将platform-tools目录配置进去
Linux:可以在hone路径下编辑.bash_profile文件,将platform-tools目录配置进去即可
OK后,进入命令行界面,输入:adb shell,cd 目录
30、内容提供器(四大组件之一):
内容URI的标准格式,
content://com.example.app.provider/table1
头部协议申请:content://
权限:com.example.app.provider
路径:/table1
将内容URI字符串解析成Uri对象:Uri.parse("content://com.example.app.provider/table1");
要加权限,要注册
http://blog.csdn.net/dmk877/article/details/50387741
http://blog.csdn.net/chenzheng_java/article/details/6232632
http://justsee.iteye.com/blog/936612
31、Notification通知:我不太会用(主要是不太会把它用在关键的地方。。。,没有让我发挥出来多大的作用。。。)
http://blog.csdn.net/loongggdroid/article/details/17616509
http://blog.csdn.net/vipzjyno1/article/details/25248021/
http://blog.csdn.net/yunwen3344/article/details/43229331?ref=myread
http://www.jb51.net/article/82065.htm
http://www.cnblogs.com/_ymw/p/4151542.html
32、相机
启动相机:startActivityForResult(intent,TAKE_PHOTO);
启动裁剪程序:startActivityForResult(inten,CROP_PHOTO);(在函数onActivityResult()里面)
33、service(四大组件之一)
服务并不是运行在一个独立的进程当中的,而是依赖于创建服务时所在的应用程序进程。当某个应用程序进程被杀掉时,所有依赖于该进程的服务也会停止运行。
子线程不能更新UI
异步消息处理机制:
主要有四个部分组成:Message,Handler,MessageQueue,Looper
Message:Message是在线程之间传递消息,他可以在内部携带少量的信息,用于在不同线程之间交换数据。(Message.what字段,还有arg1,arg2字段携带一些整型数据,obj字段携带一个Object对象)。
Handler:Handler顾名思义也就是处理者的意思,它主要是用于发送和处理消息的。发送消息一般是使用Handler的sendMessage()方法,而发出的消息经过一系列地辗转处理后,最终会传递到Handler的handlerMessage()方法中。
MessageQueue:MessageQueue是消息队列的意思,它主要用于存放所有通过Handler发送的消息。这部分消息会一直存在于消息队列中,等待被处理。每个线程中只会有一个MessageQueue对象。
Looper:Looper是每个线程中的MessageQueue的管家,调用Looper的xloop()方法后,就会进入一个无限循环中,然后每发现MessageQueue中存在一条消息,就会将它取出,并传递到Handler的handlerMessage()方法中。每个线程中也只会有一个Looper对象。
public class MainActivity extends Activity implements OnClickListener {
public static final int UPDATE_TEXT = 1;
private Button btn;
private TextView text;
private void init() {
btn = (Button) findViewById(R.id.btn);
text = (TextView) findViewById(R.id.text);
btn.setOnClickListener(this);
}
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case UPDATE_TEXT:
text.setText("nihao");
break;
default:
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn:
new Thread(new Runnable() {
@Override
public void run() {
Message message = new Message();
message.what = UPDATE_TEXT;
mHandler.sendMessage(message);
}
}).start();
break;
default:
break;
}
}
}
AsyncTask:抽象类
继承时,为AsyncTask类指定三个泛型参数:
Param、Progress、Result
需要重写四个方法:onPreExecute、doInBackground、onProgressUpdate(Progress...)、onPostExecute(Result)
execute():启动该任务
http://www.cnblogs.com/devinzhang/archive/2012/02/13/2350070.html
service的生命周期:
图片来源https://img-my.csdn.net/uploads/201204/17/1334628702_9553.png
(这个我用的还不是很好)
大神说话:
http://blog.csdn.net/guolin_blog/article/details/9797169
http://www.cnblogs.com/lwbqqyumidi/p/4181185.html
http://blog.csdn.net/pi9nc/article/details/18764415
http://blog.csdn.net/ryantang03/article/details/7770939
http://www.cnblogs.com/newcj/archive/2011/05/30/2061370.html
34,WebView
public class MainActivity extends Activity {
private WebView webView;
private void init() {
webView = (WebView) findViewById(R.id.webView);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new WebViewClient());
webView.loadUrl("http://www.baidu.com");
}
}
权限(涉及到访问网络):<uses-permission android:name="android.permission.INTERNET"/>
getSettings():可以设置一些浏览器的属性
setJavaScriptEnabled():支持JavaScript脚本
setWebViewClient():同时传入一个WebViewClient的实例,网页跳转时,仍然在WebView中显示,而不是打开新的浏览器
loadUrl():传入网址,显示内容
35,使用HTTP协议访问网络:
HttpURLConnection和HttpClient
网络服务和数据解析,我学的不够深
36、地图定位
http://blog.csdn.net/xiey94/article/details/52827295
http://blog.csdn.net/xiey94/article/details/52830552
http://blog.csdn.net/xiey94/article/details/52831404