2021年的倒数第二天,公司的员工基本都回家了,手上也没啥工作了, 之前接过IOS和android SDK , 都是照着文档复制粘贴, 现在有空,了解一下安卓知识, 《第一行代码》这本书虽然有些老旧,但是作者写的还是很仔细的,安卓的知识点对比Unity和UE4中的概念,理解起来还是比较容易的,感谢作者!
//============================AndroidManifest===========================
<action android:name="android.intent.action.MAIN" /> //主活动
<category android:name="android.intent.category.LAUNCHER" />
android:theme="@android:style/Theme.Dialog"> //对话框式活动
android:lanchMode="singleTop" //活动启动模式
//===================================Activity=================================
活动是可以叠层的,新活动覆盖在就活动上面,Back键会销毁最上面的活动,这不就是栈的概念么
Android使用Task管理活动,一个Task就是一组存放在栈中的活动集合
//活动的4种状态
运行状态(栈顶) 暂停状态(非栈顶,但可见) 停止状态(非栈顶,不可见) 销毁状态
//活动的7个生命周期
onCreate() //初始化操作
onStart() //不可见变为可见时调用, 相当于 OnVisible() //加载资源
onResume() // OnTop() //栈顶
//------------------------------------
onPause() // OnNotTop() //退出栈顶
onStop() // 相当于 OnInvisible(), 对话框式活动,OnStop不执行 //释放资源
onDestroy()
//---------
onRestart() // 相当于OnEnable()
//---------
//活动被销毁,如何保存临时数据:
onSaveInstanceState(Bundle outState) //保存临时数据,在销毁活动之前一定会被调用
// 在OnCreate方法种恢复数据
// Bundle也可以和Intent结合使用,把Bundle嵌入Intent中
活动的4种启动模式: standard, singleTop, singleTask, singleInstance
standard 模式, 每启动一个活动,它就会在返回栈种入栈, 问题是,有时候活动已经在栈顶,再次启动活动还会创建新的实例
singleTop: 启动活动时,如果发现返回栈栈顶已经是该活动,则直接使用; 如果该活动不在栈顶,则会实例化一个
singleTask: 从栈顶逐一出栈,直到发现该活动的实例, 保证了整个应该程序只有一个该活动
singleInstance:用单独的一个返回栈来管理该活动, 方便给其他程序调用
----------------------------------------------------------------------------
//1. 如何实时知道当前是哪一个活动
创建一个普通的Java类,改变活动的继承关系
public class BaseActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Log.d("BaseActivity",getClass().getSimpleName());
}
}
--------------------------------------------------------------------------
//2. 随时随地退出程序
使用一个集合类对所用活动进行管理,调用 ActivityCollector.finishAll() 即可
public class ActivityCollector{
public static List<Activity> activities=new ArrayList<>();
public static void AddActivity(Activity act){
activities.Add(act);
}
public static void RemoveActivity(Activity act){
activities.remove(act);
}
public static void finishAll(){
for(Activity item:activities){
if(!item.isFinishing()){
item.finish();
}
}
//销毁完活动杀掉当前进城,保存程序完全退出
//android.os.Process.killProcess(android.os.Process.myPid());
}
}
public class BaseActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Log.d("BaseActivity",getClass().getSimpleName());
ActivityCollector.AddActivity(this);
}
@Override
protected void onDestroy(){
super.onDestroy();
ActivityCollector.RemoveActivity(this);
}
}
--------------------------------------------------------
//3. 启动活动的最佳写法
//在SecondActivity种实现该函数
public static void actionStart(Content content,String data1,String data2){
Intent intent=new Intent(content,SecondActivity.class); //从 参数A活动,跳转到参数B活动
intent.putExtra("Param1",data1);
intent.putExtra("param2",data2);
content.startActivity(intent);
}
//调用 从 Fisrt 到 Second
SecondActivity.actionStart(FirstActivity.this,"data1","data2");
------------------------------------------------------
finish() //销毁当前活动
startActivity()
startActivityForResult() //能够返回结构给上一个活动
setContentView(R.layout.activity_main);
findViewById()
//========================================Intent=====================================
//Intent 拨打电话
Intent intent=new Intent(Intent.ACTION.DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
//Intent 打开百度
Intent intent=new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
//Intent 传递数据
String data="Hello";
Intent intent=new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("extra",data);
startActivity(intent);
//Intent 取出数据
Intent intent=getIntent();
String data=intent.getStringExtra("extra");
Log.d("SecondActivity",data);
//Intent 获取SecondActivity的结果
//FirstActivity
Intent intent=new intent(FirstActivity.this,SecondActivity.class);
startActivityForResult(intent,1); //第一个参数为Intent, 第二个参数为请求码
//FirstActivity重写 onActivityResult()处理结果
Switch(requestCode){
case 1:
if(requestCode==RESULT_OK){
String returnedData=data.getStringExtra("data_return");
Log.d("FirstActivity",returnedData);
}
}
//Intent SecondActivity中传递结果
Intent intent=new intent();
intent.putExtra("data_return","Hell FirstActivity");
setResult(RESULT_OK,intent); //第一个参数返回处理结果,第二个参数传递intent, intent中带有数据
finish();
//如果用户不是通过点击按钮回到FirstActivity,而是按下Back键呢?
把上面点击事件的代码,重写到 onBackPressed()
//===================================UI=================================
//--------------------------常用控件------------------
android:visibility // 安卓控件的可见性,适用于所有控件
visible 可见 invisible 不可见,占地方 gone 不可见不占地
setVisibility()
//TextView
android:gravity="center" //居中对其, 可选值 top, bottom, left,right,center, 可以用 | 分割
android:textSize="24sp"
android::textColor="#00ff00"
//Button
android:textALlCaps="false" //禁用大写特性
//使用匿名函数添加点击事件
btn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
// Todo
}
})
//也可以使用实现接口的方式
btn.setOnClickListener(this);
@Override
public void onClick(View v){
switch(v.getId()){
case R.id.button:
// 补充逻辑
break;
//...
}
}
//EditText
android:hint="提示性文字" //可输入文本的提醒
android:maxLines="2" //文本的最大行数
editText=(EditText)findViewById(R.id.edit_Text);
String input=editText.getText().toString(); //获取输入文本值
//ImageView
android:src="@drawable/img_1" //图片路径
imgView=(ImageView)findViewById(R.id.img_view);
imgView.setImageResource(R.drawable.img_2); //使用脚本修改图片路径
// ProgressBar
style="?android:attr/progressBarStyleHoorizontal" //样式
android:max="100" //进度条最大值
int value=ProgressBar.getProgress();
value+=10;
ProgressBar.setProgress(value);
//AlertDialag
AlertDialag.Builder dialog=new AlertDialag.Builder(MainActivity.this);
dialog.setTitle("title");
dialog.setMessage("some message");
dialog.setCancelable(false);
dialog.setPositiveButton("Ok",new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog,int which){
}
});
dialog.setNegativeButton("Cancel",new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog,int which){
}
});
dialog.show();
//ProgressDialog
ProgressDialog dialog=new ProgressDialog(MainActivity.this);
dialog.setTitle("title");
dialog.setMessage("some message");
dialog.setCancelable(false);
dialog.show();
//数据加载完成后必须调用dismiss关闭,否则会一直存在
dialog.dismiss();
// 4种 布局 ------------------------------
//1. LinearLayout
android:orientation="horizontal" //Vertical
android:layout_gravity="top" //布局对齐方式
android:layout_weight="1" //权重控制大小
//2. RelativeLayout 相对布局 和 Unity的锚点布局比较类似
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentBottow="true"
android:layout_centerInParent="true"
android:layout_above="@id/btn3"
android:layout_below="@id/btn3"
android:layout_toLeftOf="@id/btn3"
android:layout_toRightOf="@id/btn3"
android:layout_alignLeft="@id/btn3"
android:layout_alignRight="@id/btn3"
android:layout_alignTop="@id/btn3"
android:layout_alignBottom="@id/btn3"
//3. FrameLayout 比较少用
// 默认定位到布局的左上角
//4. 百分比布局,
//包括 PercentFrameLayout, PercentRelativeLayout
//在app/build.gradle添加百分比布局依赖
compile 'com.android.support:percent:24.2.1'
app:layout_widthPercent="50%"
app:layout_heightPercent="50%"
//使用 android 和 app,必须引入命名空间
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
//-----------------------自定义控件----------------
//-----------------------------------------------------------------------
//Toast
Toast.makeText(TestActivity.this,"I Click Btn",Toast.LENGTH_LONG).show();
//Menu
public boolean onCreateOptionsMenu(Menu menu)
public boolean onOptionsItemSelected(@NonNull MenuItem item)