Android Studio
- gradle设置为本地版本:
需要配置:File -> Settings
设置gradle-wrapper.properties:
- layout目录下创建子目录(目前仅在Project模式下才能显示):
参考文章:【Android Studio安装部署系列】十六、Android studio在layout目录下新建子目录
注:
※ 当前只有在project模式下才会展示出来,并且要把hide的选项去掉,不勾选(AS版本3.2) - 安卓studio预览界面显示为全面屏:
四大组件
安卓四大组件:活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver)、内容提供器(Content Provider)
服务
- 服务中的代码默认运行在主线程当中;
- 每个服务只会存在一个实例:因此只能bind一次(多次bind属于无效操作,不会重复回调onBind接口,不会报错。如果服务还没创建则会自动先创建服务),unbind接口一旦销毁服务,不能多次调用,会出现程序异常退出。startService可以多次调用,会多次回调onStartCommand回调,如果还没创建,会先自动创建服务,回调onCreate。在服务销毁后,再次调用stopService不会造成异常发生。
- 使用上应该保持startService和stopService一一对应,bind和unbind一一对应。bind启动服务,与调用者关联。如果是采用startService则启动后,与调用者无关。
Android 服务两种启动方式的区别
Activity(活动)
活动的四种状态:
- 运行状态:位于任务栈顶;
- 暂停状态:不在栈顶,但仍然可见;
- 停止状态:不在栈顶,完全不可见;
- 销毁状态:从任务栈中移出,上述的三种状态仍是处于任务栈中。系统往往更倾向回收该状态的活动,从栈中移出,并不代表被系统回收了。
活动的生命周期
活动的启动模式
- standard: 默认模式, 每次启动活动都会创建一个新的实例,入栈,占据栈顶位置
- singleTop:在启动活动时,发现该活动已处于栈顶位置,则沿用当前活动,不会创建新的实例
- singleTask:先检查栈中是否有该活动的实例,如果有,则直接使用该实例,并把这个活动之上的所有活动都出栈,无则创建新的实例
- singleInstance:不同于上述3中启动模式,指定为singleInstanch模式的活动会启用一个新的返回栈来管理这个活动
布局
-
android:textSize=“24sp” =>
单位:
px: 表明像素pixel
sp: Scale-independent Pixel(抽象像素)
dp: Density Independent Pixel(密度无关像素) -
button控件
对应的Text文档:
-
设置控件水平居中
更新UI
- runOnUiThread直接刷新UI
public class MainActivity extends Activity { private static final String TAG = MainActivity.class.getSimpleName(); private static final int REFRESH_ACTION = 1; private Button mButton; private TextView mTextView; private int mCount = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextView = (TextView) findViewById(R.id.textView1); mButton = (Button) findViewById(R.id.button1); mButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub new Thread() //worker thread { @Override public void run() { while ((mCount < 100)) { MainActivity.this.runOnUiThread(new Runnable() // 工作线程刷新UI { //这部分代码将在UI线程执行,实际上是runOnUiThread post Runnable到UI线程执行了 @Override public void run() { mCount++; mTextView.setText("I'm updated:"+ mCount); Log.i(TAG, "Count:" + mCount); } }); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }.start(); } }); } }
res目录
- 以drawable开头的都是放图片的;
- 以mipmap开头的都是放应用图标的;
- 以value开头的都是放字符串、样式、颜色配置的;
- layout文件夹是用来放布局文件的。
Jave 语法
final关键字
- final类不能被继承,没有子类,final类中的方法默认是final的
- final方法不能被子类的方法复盖,但可以被继承
- final成员变量表示常量,只能被赋值一次,赋值后不能再被改变
- final不能用于修饰构造方法
- private不能被子类方法覆盖,private类型的方法默认是final类型的
final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。
注意:final变量定义的时候,可以先声明,而不给初值,这中变量也称为final空白,无论什么情况,编译器都确保空白final在使用之前必须被初始化。
native关键字
native 关键字告诉编译器(其实是JVM)调用的是该方法在外部定义
synchronized关键字
Synchronized是Java并发编程中最常用的用于保证线程安全的方式,类似C++的中的互斥量(mutex)和锁(lock)的组合
实现多线程
- 通过继承Thread类实现多线程
package test; public class example { public static void main(String[] args){ MyThread myThread=new MyThread(); myThread.start(); while(true) { System.out.println("Main方法在运行"); } } } class MyThread extends Thread{ public void run(){ while(true){ System.out.println("MyThread类的run()方法在运行"); } } }
- 实现Runnable接口创建多线程
package test; public class example { public static void main(String[] args){ MyThread myThread=new MyThread(); Thread thread=new Thread(myThread); thread.start(); while(true) { System.out.println("Main方法在运行"); } } } class MyThread implements Runnable{ public void run(){ while(true){ System.out.println("MyThread类的run()方法在运行"); } } }
- 采用闭包的方式
new Thread() {
@Override
public void run() {
System.out.println("in thread");
}
}.start();