1. 先从看的见的入手( Toast 与 Menu )
Toast 是一种 android 中一种非常好的提醒方式,它可以将一些短小的信息通知给用户,一段时间后自动消失,不会占用任何的屏幕空间。
Menu 则可以大幅度帮我们节省屏幕空间,将菜单收缩。
具体实现
我们先在 res 目录下新建 menu 文件夹:右击 res 目录 -New-Directory
再再 menu 文件夹下新建 main 菜单文件:右击 menu 文件夹 -New-Menu resource file
就像这样:
在main.xml中添加如下代码:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/add_item"
android:title="Add"/>
</menu>
<item是一个标签,用来创建一个具体的菜单项 id 则是一个唯一的标识符,主要用来在全局中找到这个 item title 则是给其指定一个名称
然后我们在 MainActivity 里重写 onCreateOptionsMenu() ,重写方法通过 Ctrl+O 快捷键寻找
然后添加以下代码:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main,menu);
return true;
}
inflate里我们传入两个参数,第一个指定哪一个资源文件创建菜单,第二个表明菜单项添加到哪一个 Menu 对象中,这样我们就可以看得到菜单了!
当然不仅要看,还要用的了。所以定义一下菜单响应事件,我们在 MainActivity 里重写 onOptionsItemSelected() 方法。
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.add_item:
Toast.makeText(this,"You clicked it",Toast.LENGTH_SHORT).show();
break;
}
return true;
}
这里面用了一个全新的 Toast ,其通过静态方法 makeText() 创建 Toast 对象,然后调用 show() 将其显示出来就ok了。
makeText 里要传入三个参数,第一个是 Context ,其是一个抽象类。Activity 本身就是 Context 的子类,所以我们直接传入 this ,第二个是显示的文字,第三个则是显示时长 LENGTH_SHORT(2s) 与 LENGTH_LONG(3.5s)
非常好!我们就这样简单的掌握了两个工具。
当然他们还有更多更复杂的功能,这里就不一一列举了,阔以去看看这几篇博客:
- menu:https://blog.csdn.net/castanea/article/details/80992027
- Toast:https://www.cnblogs.com/plokmju/p/android_Toast.html
2. intent初步解析
使用Intent穿梭活动
显式Intent
一个Activity太单薄了,作为一个秃头 的程序猿,我们应该高级一点。
我们再创建一个活动,命名为SecondActivity:File-New-Activity-Empty Activity
我们就获得了第二个活动。
编辑layout目录下的activity-main.xml,替换成以下代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/button_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button1">
</Button>
</LinearLayout>
<Button代表一个按钮,其他的我们在之后会讲。
接着我们在MainActivity里添加以下代码:
Button button1=findViewById(R.id.button_1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
}
});
findViewById() 方法用于获取在布局文件中定义的元素,button_1 正是通过 android:id="@+id/button_1" 这样指定的。
然后我们通过调用 setOnClickListener() 方法为按钮注册一个监听器,点击按钮时即会执行 onClick 方法。
Intent 有多个构造函数的重载,这是其中一个。这个构造函数接收两个参数,第一个为 Context 要求启动活动的上下文,第二个 class 则是指定想要启动活动的目标。建立完后通过调用 startActivity() 方法就可以启动活动了,其接收一个 Intent 参数,我们将构建好的 Intent 传进去就行了。
然后运行,就可以跳转活动了!
隐式Intent
相较于显式,隐式 Intent 更智能了一点,我们可以通过指定更为抽象的 action 和 category 信息,然后让系统帮我们去找要启动哪个活动。
- action: 一个字符串,指明了当前活动可以响应这个字符串
- category: 指明当前活动的环境
只有 action 和 category 同时匹配时,这个活动才能响应 Intent。
我们先打开 AndroidManifest.xml ,找到 SecondActivity ,添加如下代码:
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="Start"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
这里我们就指定了 SecondActivity 的 action 为 “Start”,category 为 “android.intent.category.DEFAULT” 。
进入 MainActivity ,修改 onClick 里的内容像这样:
public void onClick(View v) {
Intent intent=new Intent("Start");
startActivity(intent);
}
我们同样可以进入第二个活动。
用Intent传递数据
1. 向下一个活动传递数据
Intent除了跳转活动,还可以在各个活动之间传递数据,我们来看一下。
启动活动时传递数据很简单,通过 putExtra() 方法,我们就可以将数据暂存在 Intent 中,putExtra() 里要传入两个参数,第一个是键,用于第二个活动找到你,第二个则是存储的数据。
我们在 MainActivity 将之前的代码修改一下:
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String data="Hello!";
Intent intent=new Intent(MainActivity.this,SecondActivity.class);
intent.putExtra("extra_data",data);
startActivity(intent);
}
});
那么第二个活动就得到了 Intent 里包含的数据,我们要将他取出来,通过 getIntent 来获取 Intent ,然后通过 getStringExtra 来获取传递的数据。(如果是 int 类型就是 getIntExtra ,以此类推)
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Intent intent=getIntent();
String data=intent.getStringExtra("extra_data");
Log.d("SecondActivity",data);
}
2. 返回数据给上一个活动
具体参考"第一行代码",原理一样,这里就不赘述了。
当然Intent还有一些其他的功能,具体可以看看这个
Intent:https://www.jianshu.com/p/67d99a82509b
3. 活动的生命周期
Android 是使用任务( Task )来管理 Activity 的,一个任务就是一组存放在栈里的 Activity 集合,这个栈被称作返回栈,栈(堆栈)是一种先进后出的数据结构。
每当启动一个新的Activity时,它会被放入返回栈中,并处于栈顶的位置。每当我们按下Back键或调用activity的finish()方法去销毁一个活动时,处于栈顶的Activity会出栈,这时前一个入栈的Activity就会重新处于栈顶的位置。系统总是会显示处于栈顶的Activity给用户。
Activity的生存期
Activity类中定义了7个回调方法,覆盖了Activity生命周期的每一个环节,下面来一一介绍这7个方法:
1.onCreate()
这个方法在每一个Activity类都会有,当我们新建一个Activity类时,一定会重写父类的onCreate方法,onCreate方法会在Activity第一次被创建时调用。我们应该在这个方法中完成Activity的初始化操作,比如说加载布局,初始化布局控件,绑定按钮事件等。
2.onStart()
这个方法在Activity由不可见变为可见时调用。
3.onResume()
这个方法在Activity准备好喝用户交互的时候调用。此时的Activity一定位于返回栈的栈顶,并且处于运行状态。
4.onPause()
这个方法在系统准备去启动或者恢复另一个Activity的时候调用。
5.onStop()
这个方法在Activity完全不可见的时候调用。它和onPause()方法的主要区别在于,如果启动的新Activity是一个对话框式的activity,那么,onPause()方法会得到执行,而onStop()方法并不会执行。
6.onDestory()
这个方法在Activity被销毁之前调用,之后Activity的状态将变为销毁状态。
7.onRestart()
这个方法在Activity由停止状态变为运行状态之前调用,也就是Activity被重新启动了
4. 活动的启动模式
1. 默认启动模式standard
该模式可以被设定,不在 manifest 设定时候,Activity 的默认模式就是 standard 。在该模式下,启动的Activity会依照启动顺序被依次压入 Task 中:
2.栈顶复用模式singleTop
在该模式下,如果栈顶 Activity 为我们要新建的 Activity(目标 Activity),那么就不会重复创建新的 Activity。
3.栈内复用模式singleTask
与singleTop模式相似,只不过singleTop模式是只是针对栈顶的元素,而singleTask模式下,如果task栈内存在目标Activity实例,则:
- 将task内的对应Activity实例之上的所有Activity弹出栈。
- 将对应Activity置于栈顶,获得焦点。
4.全局唯一模式singleInstance
这是我们最后的一种启动模式,也是我们最恶心的一种模式:在该模式下,我们会为目标 Activity 分配一个新的 affinity ,并创建一个新的 Task 栈,将目标 Activity 放入新的 Task,并让目标 Activity 获得焦点。新的 Task 有且只有这一个 Activity 实例。 如果已经创建过目标 Activity 实例,则不会创建新的 Task ,而是将以前创建过的 Activity 唤醒(对应 Task 设为 Foreground 状态)
作业:
1.敲出并运行《第一行代码》中2.44:体验活动的生命周期,里面的所有代码,安照书中截图所有的打印日志。
2.使用singleTop启动模式启动AActivity和BActivity,并完成以下任务:
- 使用隐式Intent从AActivity跳转至BActivity,并传递数字"250",将其打印;
- BActivity返回AActivity时,传递字符"Yes!",将其打印;
拓展博客:
- menu:https://blog.csdn.net/castanea/article/details/80992027
- Toast:https://www.cnblogs.com/plokmju/p/android_Toast.html
- Intent:https://www.jianshu.com/p/67d99a82509b
转载自:https://blog.csdn.net/weixin_43312313/article/details/102497709