安卓端入门学习及记录

这里放置着综设学习安卓端的记录


第一章主要就是做一个介绍,让我们知道对应文件是大概干什么的

我们重点要关注的是app这个文件夹下面的内容.(代码是写在app->src->main->java下面)

论一个项目到底是怎么跑起来的呢 ❓❓❓

  • 让我们首先看到AndroidManifest.xml这个文件

    202211041958683

活动需要在这里注册,没有在此注册的活动不能使用,其中

1
2
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />

表示MainActivity是这个项目的主活动,在手机上点击应用图标,首先启动的就是这个活动。

  • 再来看到app->src->main->java->com/example/helloworld->MainActivity.java

    里面有一个 onCreate()方法,这个方法是一个活动被创建时必定要执行的方法,

    onCreate方法中又有一个setContentView()方法,这个方法给当前活动引入了一个activity_main布局

    android中逻辑和视图分离,所以并不在活动中直接编写界面,而在布局文件中编写

  • 布局文件放置在main->res->layout下面

  • 打开里面的activity_main并切换到视图,就可以看到显示的hello world在哪定义的啦

详解项目中的资源

image-20230312140317696

res :

- `drawable`开头的文件夹是用来放**图片**的
- `mipmap`开头的文件夹是用来放**应用图标**的
- `values`下是用来放**字符串**的

第二章

活动:是一种可以包含用户界面的组件,主要用于和用户进行交互

活动的基本用法

创建活动

  1. app/src/main/java/com.example.activitytest下面创建一个activity(empty activity),命名为FirstActivity

创建和加载布局

Android讲究逻辑和视图分离,每一个活动对应一个布局(用来显示界面内容)

image-20230312145236713

eg:在布局中添加一个按钮button

创建布局:

1
2
3
4
5
<Button
android:id="@+id/button_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button 1" />

上述代码添加了一个Button元素,并且在Button内部增加了几个属性

  • android:id是给当前的元素定义一个唯一标识符

    如果要在xml中引用一个id,则写成’@id/id_name’

    如果是要在xml中定义一个id,则写成’+id/id_name’

加载布局:
onCreat()方法中加入:

1
setContentView(R.layout.first_layout);

在AndroidManifest文件中注册

所有的活动都需要在AndroidManifest中注册才能生效

Android studio 比较人性化,会帮我们注册

光注册活动不行,还需要为程序配置主活动

在活动中使用toast

这就是toast

image-20230312152702836

定义一个弹出toast的触发点.在onCreate()中添加以下代码

1
2
3
4
5
6
7
Button button1 = (Button) findViewById(R.id.button_1);
button1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
Toast.makeText(FirstActivity.this,"YOU clicked Button 1", Toast.LENGTH_SHORT).show();
}
});
  • findViewById()方法获取到在布局文件中定义的元素,此方法返回一个View对象
  • 调用setOnClickListener()方法为按钮注册一个监听器,点击按钮时就会执行监听器中的onClick()方法
  • makeText()创建Toast对象,show()将Toast显示出来

活动中使用menu

  1. res下新建menu文件夹,再在menu下面新建一个菜单文件(Menu resource file),命名为main

  2. main.xml中添加一下代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
    android:id="@+id/add_item"
    android:title="Add"/>
    <item
    android:id="@+id/remove_item"
    android:title="Remove"/>

    </menu>

    item标签用来创建具体的某一个菜单项,通过android:id给这个菜单项指定一个唯一的标识符;通过android:title给这个菜单项指定一个名称

  3. 回到FirstActivity,重写onCreatOptionMenu()方法(快捷键Ctrl+O)

    1
    2
    3
    4
    5
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
    }

    通过getMenuInflater()可以得到MenuInflater对象,再调用它的inflate()方法,就可以给当前活动创建菜单了.

    第二个参数用于指定我们的菜单项将添加到哪一个menu对象中

  4. 以上只是让菜单显示出来,接下来要定义菜单响应事件:在FirstActivity中重写onOptionsItemSelected()方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    switch(item.getItemId()){
    case R.id.add_item:
    Toast.makeText(this, "You clicked Add", Toast.LENGTH_SHORT).show();
    break;
    case R.id.remove_item:
    Toast.makeText(this, "You clicked remove", Toast.LENGTH_SHORT).show();
    break;
    default:
    }
    return true;

    }

    onOptionsItemSelected中,通过调用item.getItemId()来判断我们点击的是哪一个菜单项

  5. 之后在每个菜单项里面加入自己的处理逻辑

  6. 重新运行程序

销毁一个活动

Activity类提供了一个finish()方法,只需修改按钮监听器中的代码即可实现。

1
2
3
4
5
6
button1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
finish();
}
})

使用Intent在活动之间穿梭

Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组间想要执行的动作,还可以在不同组间之间传递数据。

Intent一般可以用来启动活动、启动服务以及发送广播等场景。

Intent大致分为显示Intent和隐式Intent两种

使用显式Intent

Intent有多个构造函数的重载,其中一个是Intent(Context packageContext,Class<?>cls),这个构造函数接受两个参数

  • 第一个参数Context要求提供一个启动活动的上下文
  • 第二个参数Class则是指定想要启动的目标活动,通过这个构造函数就可以构建出Intent的“意图”。

如何使用这个Intent?

Activity类中提供了一个startActivity()方法,这个方法是专门用于启动活动的,它接受了一个Intent参数,这里我们将构建好的Intent传入startActivity()方法就可以启动目标活动了

接下来修改FirstActivity中的按钮点击事件

1
2
3
4
5
6
7
8
button1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
// Toast.makeText(FirstActivity.this,"YOU clicked Button 1", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent);
}
});

首先构建出一个Intent,传入FirstActivity.this作为上下文,传入SecondActivity.class)作为目标活动

所以,我们的"意图"是:在``FirstActivity这个活动的基础上,打开SecondActivity这个活动,然后通过startActivity()`方法来执行这个Intent

使用隐式Intent

隐式Intent*不明确指出我们想要启动哪一个活动,*而是指定了一系列更为抽象的action和category等信息,然后交由系统去分析这个Intent,帮助我们找出合适的活动去启动

  • AndroidMainifest.xml中添加<intent-filter>
1
2
3
4
5
6
7
8
9
10
11
12
 <activity
android:name=".SecondActivity"
android:exported="false">
<intent-filter>
<action android:name="com.example.activitest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>

<meta-data
android:name="android.app.lib_name"
android:value="" />
</activity>

action标签中我们指明了当前活动可以响应com.example.activity.ACTION_START这个action,而category标签则包含了一些附加信息,更加精确地指明了当前的活动能够响应Intent中还可能带有的category。

只有<action><category>中的内容同时能够匹配上Intent中指定的action和category时,这个活动才能响应该Intent。

  • 修改FirstActivity中的点击事件

    1
    2
    3
    4
    5
    6
     public void onClick(View v){
    // Toast.makeText(FirstActivity.this,"YOU clicked Button 1", Toast.LENGTH_SHORT).show();
    // Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
    Intent intent = new Intent("com.example.activitest.ACTION_START");
    startActivity(intent);
    }
  • 重新运行程序

更多隐式Intent的用法

*使用隐式Intent,不仅可以启动自己程序内的Activity,还可以启动其他程序的Activity,*这就使多个应用程序之间的功能共享成为了可能。

比如你的应用程序中需要展示一个网页,这时你没有必要自己去实现一个浏览器,只需要调用系统的浏览器来打开这个网页就行了。
修改FirstActivity中按钮点击事件的代码,如下所示:

1
2
3
4
5
6
7
8
9

public void onClick(View v){
// Toast.makeText(FirstActivity.this,"YOU clicked Button 1", Toast.LENGTH_SHORT).show();
// Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
// Intent intent = new Intent("com.example.activitest.ACTION_START");
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("https://zrpiupiupiu.github.io/"));
startActivity(intent);
}

这里我们首先指定了Intent的action是Intent.ACTION_VIEW,这是一个Android系统内置的动作,其常量值为android.intent.action.VIEW然后通过Uri.parse()方法将一个网址字符串解析成一个Uri对象,再调用Intent的setData()方法将这个Uri对象传递进去。重新运行程序,在FirstActivity界面点击按钮就可以看到打开了系统浏览器。

其他协议的响应

除了https协议外,我们还可以指定很多其他协议,比如geo表示显示地理位置、tel表示拨打电话。下面的代码展示了如何在我们的程序中调用系统拨号界面。

1
2
3
4
5
6
button1.setOnClickListener {
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent)
}

首先指定了Intent的action是Intent.ACTION_DIAL,这又是一个Android系统的内置动作。然后在data部分指定了协议是tel,号码是10086。

向下一个活动传递数据

Intent中提供了一系列putExtra()方法的重载,可以把我们想要传递的数据暂存在Intent中,在启动另一个Activity后,只需要把这些数据从Intent中取出就可以了

现在,我们在FirstActivity中有一个字符串,想把这个字符串传递给SecondActivity

  • 首先在FierstActivity中改写点击按钮事件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 button1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
// Toast.makeText(FirstActivity.this,"YOU clicked Button 1", Toast.LENGTH_SHORT).show();
// Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
// Intent intent = new Intent("com.example.activitest.ACTION_START");

// Intent intent = new Intent(Intent.ACTION_VIEW);
// intent.setData(Uri.parse("https://zrpiupiupiu.github.io/"));

// Intent intent = new Intent(Intent.ACTION_DIAL);
// intent.setData(Uri.parse("tel:10086"));

String data = "Hello SecondActivity";
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
intent.putExtra("extra_data",data);
startActivity(intent);
}
});

这里还是使用显式Intent的方式来启动SecondActivity,并通过putExtra()方法传递了一个字符串。注意,这里putExtra()方法接收两个参数,第一个参数是键,用于之后从Intent中取值,第二个参数才是真正要传递的数据。

  • 然后在SecondActivity中将传递的数据取出,并打印出来,代码如下所示:
1
2
3
4
5
6
7
8
9
10
11
public class SecondActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);
Intent intent = getIntent();
String data = ((Intent) intent).getStringExtra("extra_data");
Log.d("SecondActivity",data);
}
}

通过getIntent()方法获取到用于启动SecondActivity的Intent

调用getStringExtra()方法获取传递的数据(字符串)

  • 运行程序

返回数据给上一个活动

活动的生命周期

返回栈

  • Android使用任务(Task)来管理活动

  • 一组任务就是一组存放在栈里的活动的集合

  • 系统总是会把栈顶的活动显示给用户

活动状态

每个活动在其生命周期中最多可能有4种状态

  1. 运行状态

    活动处于返回栈的栈顶时

  2. 暂停状态

    活动不再处于栈顶,但仍然是可见时

  3. 停止状态

    活动不再处于栈顶,并且完全不可见

  4. 销毁状态

    活动从返回栈中移除后

活动的生存期

Activity类中定义了7个回调方法

  1. onCreate()

    在活动第一次被创建时调用

    我们在这个方法中完成活动的初始化操作,例如加载布局,绑定事件等

  2. onStart()

    在活动由不可见变为可见时调用

  3. onResume()

    在活动准备好和用户进行交互的时候调用

    此时的活动一定处于返回栈的栈顶,并且处于运行状态

  4. onPause()

    在系统准备去启动或恢复另一个活动的时候调用

    通常会在这个方法中将一些消耗cpu的资源释放掉,以及保存一些关键的数据,但这个方法一定要快,不然会影响到新的栈顶活动的使用

  5. onStop()

    在活动完全不可见的时候调用

    它和onPause()方法的主要区别在于,如果启动的新活动是一个对话框式的活动,那么onPause()方法会得到执行,而onStop()方法并不会执行

  6. onDestory()

    在活动被销毁之前调用,之后的活动状态变为销毁状态

  7. onRestart()

    在活动由静止状态转变为运行状态之前调用.即活动被重新启动了

以上7种方法中除了onReatart()方法,其他都是两两对应的,所以又可以将活动分为3种生存期

  • 完整生存期:从onCreate()onDestroy()方法之间,活动会在onCreate()完成初始化操作,在onDestroy()中释放占用的资源。
  • 可见生存期:从onStart()onStop()方法之间。在这段时间,活动对于用户是可见的,但是并非是在最前端可以与用户进行交互的。
  • 前台生存期:从 onResume()onPause方法之间,在这个期间,此活动在所有活动之前并与用户进行交互。我们平时看到和接触最多的也就是这个状态下的活动

下面这个是Android官方提供的活动生命周期的示意图:

活动的启动模式

  1. standard

    活动的默认启动模式,每次都新建一个实例对象

  2. singleTop

    如果在任务栈顶发现了相同的实例则重用,否则新建并压入栈顶

  3. singleTask

    每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例

  4. singleInstance

    会启用一个新的返回栈来管理这个活动

standard:

singleTop:

启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例,如果未处于栈顶,则会创建新的实例

配制方法实在AndroidMainifest.xml中进行:

1
2
3
4
5
<activity
android:name=".SingleTopActivity"
android:label="@string/singletop"
android:launchMode="singleTop" >
</activity>

singleTask:

与singleTop的区别是singleTask会扫描整个任务栈并制定策略

使用时需要小心因为会将之前入栈的实例之上的实例全部移除,需要格外小心逻辑。

配制方法:

1
2
3
4
5
<activity
android:name=".SingleTopActivity"
android:label="@string/singletop"
android:launchMode="singleTop" >
</activity>

第三章

常用控件的使用

基本用法:

  • 给控件定义一个id
  • 指定控件的宽度和高度
  • 适当加入控件的特有属性

textView

  1. android:gravity指定文字对齐方式,其值有top,bottom,left,right,center等
  2. android:textSize指定文字大小,使用sp作为单位
  3. android:txetColor指定文字颜色

Button

系统会对Button中的所有英文字母自动进行大写转换

如果不想要这种效果,可以使用 android:textAllcaps="false"来禁用这一默认特性

EditText

EditText允许用户在控件中输入和编辑内容,并可以在程序中对这些内容进行处理

  1. android:hint指定提示性文本在输入框中,一旦有内容输入,提示性文本就消失
  2. android:maxLines指定EditText的最大行数,当输入内容超过指定行数时,文本就会向上滚动,而EditText则不会再继续拉伸

ImageView

这个控件用于在界面上展示图片

ProgressBar

用于在界面上显示一个进度条,表示我们的程序正在加载一些数据

AlertDialog

可以在当前界面弹出一个对话框,这个对话框置顶于所有界面元素之上,能够屏蔽掉其他控件的交互能力

所以AlertDialog一般都是用于提示一些非常重要的内容或者警告信息

ProgressDialog

与AlertDialog相似,可以在当前界面弹出一个对话框,这个对话框置顶于所有界面元素之上,能够屏蔽掉其他控件的交互能力.不同的是,ProgressDialog会在对话框中显示一个进度条,一般比较当前操作比较耗时,让用户耐心等待

详解四种基本布局

屏幕截图 2022-11-06 220955

线性布局LinearLayout

这个布局会将它所包含的控件在线性方向上依次排列

相对布局RelativeLayout

通过相对定位的方式让控件出现在布局的任何位置

RelativeLayout中的属性非常多,但大多有规律可循

帧布局FrameLayout

比前两种布局简单,应用场景也少许多

所有的控件都会默认摆放在布局的左上角

百分比布局

直接指定控件在布局中所占的百分比

创建自定义控件

image-20221110172738596

所有的控件都是直接或间接继承自View,所有布局都是直接或间接继承自ViewGroup

View是Android中最基本的一种ui组件,它可以在屏幕上绘制一块矩形区域,并且能够响应这块区域的各种事件

引入布局

  1. 新建一个布局title.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
    android:id="@+id/title_back"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_margin="5dp"
    android:text="Back"
    android:textColor="#fff" />
    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/title_edit"
    android:layout_gravity="center"
    android:layout_margin="5dp"
    android:text="Edit"
    android:textColor="#fff" />

    <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/title_edit"
    android:layout_gravity="center"
    android:layout_margin="5dp"
    android:textColor="#fff"
    android:text="Edit" />

    </LinearLayout>

创建自定义控件

LIstView控件


安卓端入门学习及记录
http://example.com/2022/10/21/安卓端入门学习及记录/
作者
YiZhi_w
发布于
2022年10月21日
许可协议