又是一年,慢慢开始往大前端趋势转,Android算算也工作这么久了,一直很想找个时间系统归纳一下自己android的知识体系,或查漏补缺,或精卫填海…一直没觉得自己技术多厉害,总是感觉如同一个尘埃,第一篇的产出来自北京的第一份工作,到现在,还是很感谢自己的选择了,虽然那一份是当时手里offer中工资最低的,工作时间996,因为源码,没有犹豫就选了。很庆幸在那个Android市场有回落趋势却也相对热乎的时候,就开始在意底层,即使,那个时候菜的一13~现在也有很多缺陷… 拔出来买了很久的【第一行代码】顺顺思路,一本一本来~初学者推荐看,0基础入门~写的挺好的~
Android项目格式:
1.src :所有java代码
2.gen:这个目录内容全部是自动生成的。这个文件永远不需要手动修改。主要有一个R.java文件,即对应资源id
3.assets: 用的不多,主要存放一些随程序打包的文件。webview加载本地网页功能,所有相关网页文件也放在这里
4.bin:主要包含一些在编译时自动产生的文件。打包成功的apk就在这个下面
5.libs:放第三方jar包。
6.res: 所有资源,文件/图片/布局等
7.AndroidManifest.xml: 整个android项目的配置文件。四大组件配置位置,权限,版本兼容
8.project.properties: 指定编译程序使用的sdk版本
隐藏标题栏
onCreate方法中,在setContentView前面调用:
requestWindowFeature(Window.FEATURE_NO_TITLE)
显示/隐示 Intent
//显示
startActivity(this,new Intent(A.class));
//隐示实例一
<activity andrid:name=".A">
<intent-filter>
//action 和category同时匹配才能相应,DEFAULT为默认,只需对应action
<action android:name="com.example.acticity.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="com.example.acticity.ATEST"/>
</intent-filter>
</activity>
startActivity(new Intent("com.example.acticity.ACTION_START");
//添加category
//对应:action 和category同时匹配
Intent intent=new Intent("com.example.acticity.ACTION_START");
intent.addCategory("com.example.acticity.ATEST");
startActivity(intent);
//隐2:
Intent intent=new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(" http://baidu.com "));
startActivity(intent);
Intent intent=new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse(" tel:100086"));
startActivity(intent);
数据传递
//传递数据
String data="hello world";
Intent intent=new Intent(this,A.class);
intent.putExtra("extra_data",data);
startActivity(intent);
//接收数据
Intent intent=getIntent();
String data=intent.getStringExtra("extra_data");
数据返回给上一个activity
//firstActivity.class
Intent intent=new Intent(this,A.class);
//这的100,请求码是一个唯一值就可以了
startActivityForResult(intent,100);
//requestCode 发送数据携带的请求码
//resultCode 放回数据时传入的处理结果
//data:intent携带的参数
..onActivityResult(int requestCode, int resultCode, Intent data){
//可以通过requestCode 和resultCode 来针对处理
switch(requestCode){
case 1:
if(rsultCode==RESULT_OK){
data.getStringExtra("data_result");
}
}
}
//A.class
Intent intent=new Intent();
intent.putExtra("data_return","hello world");
/**
* 第一个参数:用于向回传递的数据【一般是RESULT_OK或RESULT_CANCELED】
* 第二个参数:把带有数据的intent传递回去
*/
setResult(RESULT_OK, intent);
用户点击back按钮数据无法返回,可以我们可以重写onBackPressed,其中添加返回逻辑
生命周期直接过
activity被回收怎么办?解决数据丢失
OnSaveInstanceState(Bundle outState) //保存数据
onCreate(Bundle saveInstanceState) //获取到保存到
//保存数据
OnSaveInstanceState(Bundle outState) ..{
String tempData="you data"
ouState.putString("data_key",tempData);
}
//重写创建的时候获取数据
onCreate(Bundle saveInstanceState) {
if(saveInstanceState !=null){
String tempData = saveInstanceState.getString("data_key");
}
}
activity启动模式
1.standard:普通的
2.singleTop:activity在栈顶就就复用实例,不在重新创建一个
3.singleTask: 检查整个栈是否有这个实例,有就直接复用,并弹出它上面的所有activity,没有直接创建
4.singleInstance:启动一个新的栈存放实例
快速退出程序[关闭所有activity]
创建一个管理类:
public class ActivityCollector{
public static list<Activity> activitys=new ArrayList<Activity>
public static void addActivity(Activity activity){
activitys.add(activity);
}
public static void removeActivity(Activity activity){
activitys.remove(activity);
}
public static void finishAll( ){
for(Activity activity: activitys){
if(!activity.isFinishing()){ activity.finish(); }
}
}
}
创建一个BaseActivity, 创建的activity继承
public class BaseActivity extends Activity{
... onCreate(..){
ActivityCollector.addActivity(this);
}
... onDestory(...){
ActivityCollector.removeActivity(this);
}
}
关闭所有activity
ActivityCollector.finishAll();
Android UI细节
图片
1.imageView.setImageResource(R.drawable.xx) 设置图片资源
2.图片使用background会将图片放大,默认是图片上下拉升进行适配
3.图片使用src不会让图片失真,如果图片不能够填充整个窗口,可以添加scaleType属性【android:scaleType=centerCrop :会讲图片进行等比例的拉升,将图片从中间位置进行放大进行适配】
4.splash页面全屏,电池信号bar都隐藏掉:
//设置style
<style name="AppTheme.FullScreen">
<item name="windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
</style>
//使用
<activity
android:name=".ui.activity.SplashActivity"
android:theme="@style/AppTheme.Fullscreen">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
使用Preference控件
这个业务逻辑开发中真没有用过,学kotlin的时候倒是用了一下实战项目
1.设置页面设置layout (activity_setting)
2.写一个类继承PreferenceActivity/PreferenceFragment 这个列子继承后者
2.1创建 SettingFragment : PreferenceFragment
2.2 onCreateView()使用addPreferenceFromResoure(R.xml.setting)
2.3 创建xml文件
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android";>
<Preference
android:key="clear_cache"
android:title="清除缓存" />
<SwitchPreference
android:key="push"
android:title="推送通知" />
<SwitchPreference
android:key="no_wifi"
android:title="非wifi下加载tup" />
<Preference
android:key="about"
android:title="关于" />
</PreferenceScreen>
3.回到setting_activity布局中完善布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android";
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<include layout="@layout/toolbar" />
<fragment
android:id="@+id/setting_fragment"
class="dengxj.kotlin.demo.com.ui.fragment.SettingFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
4.获取Preference里面存值
//获取通知有没有选中
val sp = PreferenceManager.getDefaultSharedPreferences(this)
val push = sp.getBoolean("push", false)
println("push=$push")
布局
Tablelayout: 允许我们使用表格方式来排列控件,很少用。
//这里的“1”,表示如果表格不能完全占满屏幕宽度,就将第二列拉伸。同理,如果是0,就是拉申第一列
<TableLayout xml:......
android:stretchColumns="1"
>