重识Activity—Activity的基本使用
最近在梳理Android知识的技能点,感觉有好多知识点在工作过程中没有用到,就渐渐忘记了,现在又重新梳理,做个记录,方便以后查阅。也算是对自己这几年工作的一个知识总结。
从Android最基础开始,今天主要分享Activity的基础知识,后续会更新一系列关于Activity的文章。
简介Activity
Activity是Android四大组件之一,主要用于和用户进行交互,例如:打电话,照相,查看地图等。Activity可以理解为用户交互的窗口,这个窗口可以铺满整个屏幕,也可以小于整个屏幕浮在另一个窗口上面,大多数App都是由多个Activity组成。应用除了可以访问自己的Activity,还可以访问其他App中被允许访问的Activity。
创建Activity
- 我们创建的Activity必须继承Activity或者其子类,或者直接使用Activity的子类;
- 在子类中必须要重写
onCreate()
方法,在该方法中调用setContentView()
方法加载向用户展示的布局,同时,在该方法中还需要初始化一些操作;
public class MainActivity extends AppCompatActivity {
//重写onCreate()方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);//这一行必须有,否则会报错
setContentView(R.layout.activity_main);//加载布局
}
}
配置Activity
创建完Activity后,需要在AndroidManifest.xml
文件中注册,如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myfirstapplication">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/TitleBarStyle">
<!--Activity注册-->
<activity android:name=".MainActivity">
</activity>
</application>
</manifest>
其中,<activity></activity>
标签是对我们创建的Activity的注册。上述代码中是对Activity最简单的注册,只标注它的name即可。属性android:name
的值是 包名.我们创建的Activity类名,上述代码中,该属性的值是“.MainActivity”是简写,因为在<manifest></manifest>
标签中已经声明属性package
的值是“com.example.myfirstapplication”,当然这里也可以写成完整的值,即“com.example.myfirstapplication.MainActivity”。
ActivityNotFoundException.png注意:创建Activity后,一定要在AndroidManifest.xml配置文件中注册Activity,否则会报错:ActivityNotFoundException。
启动Activity
- startActivity(Intent intent):不带返回结果。其中,Intent代表的是意图,描述要启动的Activity的信息,下面是最简单的启动Activity的方式:
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);//启动activity,不带返回值
-
startActivityForResult(Intent intent,int requestCode):带有返回结果。其中,int类型的参数requestCode是我们自己自定义的请求码,定义的值需要> = 0。
使用该方法启动Activity,我们需要重写onActivityResult(int requestCode,int resultCode,Intent data)
这个回调方法,其中, requestCode是我们在调用启动Activity时自定义的请码,需要> = 0;
resultCode是被启动的Activity通过setResult(resultCode,intent)
返回的结果码;
data是Intent类型的数据,将数据结果返回给调用者。
示例如下:
MainActivity.java
中的代码:
public void launchSecond(View view){
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivityForResult(intent,1);//启动Activity,并带有请求码
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
switch (requestCode){
case 1:
if(resultCode == RESULT_OK){
String returnData = data.getStringExtra("data_return");
Log.d("Alisa",returnData);
}
break;
}
}
SecondActivity.java
中的代码:
public class SecondActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);
findViewById(R.id.button_2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("data_return","Hello MainActivity");
setResult(RESULT_OK,intent);//专门用于向上一个活动返回数据
finish();
}
});
}
@Override
public void onBackPressed() {
Intent intent = new Intent();
intent.putExtra("data_return","Hello MainActivity");
setResult(RESULT_OK,intent);//专门用于向上一个活动返回数据
super.onBackPressed();
}
}
关闭Activity
关闭Activity,一般是由系统操作的,但是如果我们确定用户不再返回到此Activity,我们可以通过两种方式关闭。
-
finish():调用该方法直接关闭当前的Activity。有时,我们可以通过
isFinishing()
方法判断当前的Activity是否关闭,如果没有,然后在调用该方法。示例如下:
if(isFinishing()){
finish();
}
-
finishActivity(int requestCode):该方法是关闭一个独立的之前启动的Activity。用在关闭使用
startActivityForResult(intent,requestCode)
方法启动的Activity。
Activity隐藏标题栏
- 代码的方式
requestWindowFeature(Window.FEATURE_NO_TITLE);
上述代码的意思是在Activity中不再显示标题栏,必须在setContentView()
方法之前调用,否则会报错:RuntimeException。
注意:该方法只能在我们创建的子类是继承除AppCompatActivity之外的Activity中使用,如果子类继承的是AppCompatActivity,不起任何作用。
- 定义Style,在AndroidManifest.xml文件中注册时配置自定义的样式(theme)
AndroidManifest.xml
文件中配置:
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/TitleBarStyle">
<!--Activity注册-->
<activity android:name=".MainActivity"
android:theme="@style/TitleBarStyle">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
styles.xml
文件中自定义Style:
<style name="TitleBarStyle" parent="AppTheme">
<item name="android:windowNoTitle">true</item>
<item name="windowNoTitle">true</item>
</style>
说明:
- 如果只是让某个Activity隐藏标题栏,那么在注册的
<activity />
中的属性android:theme
设置值为我们自己自定义的style:“@style/TitleBarStyle”,未设置的Activity还是展示标题栏的; - 如果是整个App都要求隐藏标题栏,则在
<application />
标签中的属性android:theme
设置值为我们自己自定义的style:“@style/TitleBarStyle”; -
windowNoTitle
是appcompat-v7中的属性,所以,如果子类继承AppCompatActivity,使用该属性,属性值设置为true; -
android:windowNoTitle
代表的是系统的属性。除了子类继承的是AppCompatActivity外的其他Activity使用该属性,属性设置为true; - 在子类继承AppCompatActivity时,如果
windowNoTitle
和android:windowNoTitle
都设置为false,将展示两个标题栏; - 如果在自定义style时,同时将
windowNoTitle
和android:windowNoTitle
都设置为true,这样不管继承的是哪个Activity,都可以隐藏标题栏。
Activity设置label
在<activity />
中如果不设置属性label
,那么默认展示的是<application />
中设置的label
属性值,如果设置label
属性,则展示设置的label值,说明<activity />
中的属性label
优先级比<application />
的高。
以上,就是我整理的关于Activity的基本使用的知识,后续会继续整理关于Activity的系列文章,请大家继续关注!