美文网首页
重识Activity—Activity的基本使用

重识Activity—Activity的基本使用

作者: Android_程序媛 | 来源:发表于2019-04-16 16:23 被阅读0次

    最近在梳理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”。

    注意:创建Activity后,一定要在AndroidManifest.xml配置文件中注册Activity,否则会报错:ActivityNotFoundException。

    ActivityNotFoundException.png

    启动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。

    RuntimeException.png

    注意:该方法只能在我们创建的子类是继承除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>
    

    说明:

    1. 如果只是让某个Activity隐藏标题栏,那么在注册的<activity />中的属性android:theme设置值为我们自己自定义的style:“@style/TitleBarStyle”,未设置的Activity还是展示标题栏的;
    2. 如果是整个App都要求隐藏标题栏,则在<application />标签中的属性android:theme设置值为我们自己自定义的style:“@style/TitleBarStyle”;
    3. windowNoTitle是appcompat-v7中的属性,所以,如果子类继承AppCompatActivity,使用该属性,属性值设置为true;
    4. android:windowNoTitle代表的是系统的属性。除了子类继承的是AppCompatActivity外的其他Activity使用该属性,属性设置为true;
    5. 在子类继承AppCompatActivity时,如果windowNoTitleandroid:windowNoTitle都设置为false,将展示两个标题栏;
    6. 如果在自定义style时,同时将windowNoTitleandroid:windowNoTitle都设置为true,这样不管继承的是哪个Activity,都可以隐藏标题栏。

    Activity设置label

    <activity />中如果不设置属性label,那么默认展示的是<application />中设置的label属性值,如果设置label属性,则展示设置的label值,说明<activity />中的属性label优先级比<application />的高。

    以上,就是我整理的关于Activity的基本使用的知识,后续会继续整理关于Activity的系列文章,请大家继续关注!

    相关文章

      网友评论

          本文标题:重识Activity—Activity的基本使用

          本文链接:https://www.haomeiwen.com/subject/lzcpwqtx.html