美文网首页
第一行代码(1)Activity

第一行代码(1)Activity

作者: 官子寒 | 来源:发表于2019-10-21 22:13 被阅读0次

    0. 什么是Activity

    Activity 是一个应用组件,用户可与其提供的屏幕进行交互,以执行拨打电话、拍摄照片、发送电子邮件或查看地图等操作。 每个 Activity 都会获得一个用于绘制其用户界面的窗口。窗口通常会充满屏幕,但也可小于屏幕并浮动在其他窗口之上。

    1. 创建活动

    Android Studio在创建项目的时候如果不选择 Add No Activity,会自动帮我们创建出一个主活动,而这在实际活动中是远远不够的。

    当我们想手动添加Activity的时候,有以下两种方式:

    • 自动创建
    • 手动创建

    1.1 自动创建

    直接在Android Studio中的Java项目文件夹下点击创建Activity,如下图所示,强大的Android Studio会自动创建好Activity和其所需要的配置文件。

    创建Activity

    这种方式能创建出来Activity的大体框架,实为方便,在工作中能提高不少效率

    1.2 手动创建

    一个Activity的引入分为3个步骤

    • 页面
    • 注册

    :首先需要在Java项目目录下创建一个Java类,这个类需要继承AppCompactActivity

    public class FirstActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(SavedInstance);
    }
    }
    

    在这个类中,必须要重写[onCreate()]接口,关于[onCreate()]的具体用法和作用,后面会详细讲到

    页面:在\color{red}{app/src/main/res/layout}目录下创建一个 layout resource file,这个xml文件主要用来展示页面的样式,也就是App中用户看到的那个样子。
    我们看看这个layout文件的大概样子

    <?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">
    </LinearLayout>
    

    可以看到,这个xml文件中包干了一个LinearLayout标签,其中的属性包括xmlns:android,android:layout_width,android:layout_height,android:orientation,分别用来指定页面的 NameSpace宽度高度排列方向

    同时,这个xml文件有两种浏览方式,一种是如上的Text视图,一种是Design视图,可以让开发者直接看到页面上的布局和样式,如下所示

    Design模式

    其中有几点需要注意

    1. 可以进行Text和Design两种视图的切换
    2. 每个layout文件都需要有一个布局模式根节点,例如LinearLayout等

    注册:在\color{red}{app/src/main/AndroidManifest.xml}目录下有一个AndroidManifest.xml文件,这个文件主要用来注册所有的活动,活动也只有注册之后才能使用。

    如果想将一个活动注册为主活动,可以指定相应的actioncategory,如下代码所示

     <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" /> 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    

    在后续我们使用intent来对活动进行操作时,会继续对Manifest进行编辑,这里只需要掌握大概定义和写法就够了

    2. Activity生命周期

    Activity声明周期.png

    这张图代表了Activity的从创建、执行到销毁的全过程,其中可以看到,经过的周期分为7个部分,分别是:

    • onCreate() 在活动第一次被创建的时候调用,主要完成初始化操作,例如加载布局、绑定事件等
    • onStart() 活动不可见变为可见的时候调用
    • onResume() 当活动与返回栈的栈顶,并且处于运行状态时调用
    • onPause() 在系统准备去启动或者回复另一个活动时调用。通常会在这个方法中将一些小号CPU的资源释放掉,以及保存一些关键数据
    • onStop() 在活动完全不可见的时候调用
    • onDestroy() 被销毁之前调用,然后活动变为销毁
    • onRestarrt() 被重新启动

    一些常见事件执行的生命周期
    1. 跳转其他活动onPause()onStop()
    2. 返回活动onRestarrt()onStart()onResume()
    3. 第一次被创建onCreate()onStart()onResume()
    4. 跳转DialogonPause()
    5. 退出应用onPause()onStop()onDestroy()

    3. Activity数据流

    3.1 Activity数据保存

    当重新进入应用的时候,Activity会经历onCreate()方法,因此会将以前操作的数据全部抹掉,这极不利于用户体验。为了解决这一问题,我们使用onSaveInstanceState()方法来对Activity数据进行保存。
    onSaveInstanceState(Bundle outState):回调方法,在活动被回收之前一定被调用,outstate用来接收所保存的内容

    @Override
    protected void onSaveInstanceState(Bundle outState){
        super.onSaveInstanceState(outState);
        String tempData = "Something you just typed";
        outState.putString("data_key", tempData);
    }
    

    这样就可以在onCreate()中接收并且使用

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(savedInstanceState != null) {
            String tempData = savedInstanceState.getString("data_key");
            Log.d(TAG,tempData);
        }
    }
    

    3.2 返回数据给上一个活动

    可以使用startActivityForResult()来给上一个活动传递数据。
    startActivityForResult()启动的活动在销毁时会回调一个onActivityResult()方法,可以用来接受下一个活动传回来的数据。

    First Activity

    @Override
        protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
            switch (requestCode){
                case 1:
                    if(resultCode == RESULT_OK){
                        String returnedData = data.getStringExtra("data_return");
                        Log.d("FirstActivity", returnedData);
                    }
                    break;
                default:
            }
        }
    

    Second Activity 注意setResult方法

    @Override
        public void onBackPressed() {
            Intent intent = new Intent();
            intent.putExtra("data_return","Hello First Activity");
            setResult(RESULT_OK,intent);
            finish();
        }
    

    3.3 给下一个活动传递数据

    可以利用Intent向下一个活动传递数据,Intent中有putExtra()方法,用于放入传递的数据,下一个活动可以利用getIntent()拿到传进来的Intent对象,并调用Intent中的getString() getBoolean()等方法来获取数据。
    putExtra(key,value) 存如键值对
    value = intent.getString(key) 通过键获取值

    4. Intent

    4.1 显示Intent

    显式Intent 意图非常明显的Intent,直接指定在谁的环境中,打开哪个Activity

    Intent构造函数一共有5种

    • new Intent(Intent o) 复制构造函数
    • new Intent(context,class) 直接传入当前上下文和下一个活动的class
    • new Intent(action) 给定action来操作
    • new Intent(action, URI) 利用指定的action来操作给定的URI
    • new Intent(action, URI,context,class) 利用给定的操作和数据为给定的组件创建Intent
      Intent构造函数

    4.2 隐式Intent

    隐式Intent 意图不明显的Intent,而是制定了一系列更为抽象地actioncategory等信息,然后由系统分析这个Intent,并帮助分析启动哪个

    使用隐式Intent的步骤如下:

    1. 创建隐式Intent
      隐式Intent的创建方法在上面构造函数已经包括了,就是调用 new Intent(action) 来指定想要访问的action,如果想要添加category,那么只需要调用intentaddCategory() 方法就可以了
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                    Intent intent_start = new Intent("com.example.activitytest.ACTION_START");
    intent_start.addCategory("com.example.activitytest.MY_CATEGORY");
                    startActivity(intent_start);
                }
            });
    
    1. 添加action / category
      指定了Intent,当然要在系统中添加相应的actioncategory。我们需要做的是在AndroidManifest.xml文件中添加如下的代码
    <intent-filter>
              <action android:name="com.example.activitytest.ACTION_START" />
               <category android:name="com.example.activitytest.MY_CATEGORY" />
    </intent-filter>
    

    这样就会为我们寻找到具有相应actioncategoryIntent,并跳转至这个Intent

    常见的action
    Intent.ACTION_MAIN
    Intent.Action_CALL
    Intent.Action.DIAL
    Intent.ACTION_VIEW 显示用户数据

    Uri uri=Uri.parse("geo:39.899533,116.036476"); //打开地图定位
    Intent it = new Intent(Intent.ACTION_VIEW,uri);
    startActivity(it);
    
    Intent intent = new Intent(Intent.ACTION_VIEW); //播放视频
    Uri uri = Uri.parse("file:///sdcard/media.mp4");
    intent.setDataAndType(uri, "video/*");
    startActivity(intent);
    

    更多可以看这个链接 https://www.jianshu.com/p/c9b383caab02

    5. 活动启动模式

    5.1 standard

    standard模式是Activity启动的标准模式,每一个打开的活动都会入栈,且会重复入栈


    standard模式

    注:图片转载于 https://blog.csdn.net/zy_jibai/article/details/80587083

    5.2 singleTop

    singleTop是为了解决重复打开栈顶活动而生,当栈顶活动(Activity2)试图打开一个Activity2时,它不会创建新的Activity2。

    singleTop模式

    注:图片转载于 https://blog.csdn.net/zy_jibai/article/details/80587083

    如果要指定singleTop打开方式,需要在AndroidManifest.xml文件中标明android:launchMode="singleTop"

    <activity android:name=".TwoActivity"
                android:launchMode="singleTop">
    

    应用场景
    开启渠道多,适合多应用开启调用的Activity:通过这种设置可以避免已经创建过的Activity被重复创建

    5.3 singleTask

    singleTask用来解决在栈内创建多个活动实例的问题,它会自动搜寻栈内已有的Activity,如果匹配上,则跳转至对应的Activity,同时这个Activity上面所有的Activity出栈

    singleTask模式

    注:图片转载于 https://blog.csdn.net/zy_jibai/article/details/80587083

    <activity
                android:name=".ThirdActivity"
                android:launchMode="singleTask" /activity>
    

    应用场景
    程序主界面,我们肯定不希望主界面被多创建,而且在主界面退出的时候退出整个App是最好的设想。

    5.4 singleInstance

    在这种模式每个应用程序会有一个单独的返回栈,不管是哪个应用程序来访问这个活动,都共用的一个返回栈,可以解决活动共享的问题

    singleInstance模式

    注:图片转载于 https://blog.csdn.net/zy_jibai/article/details/80587083

    <activity
                android:name=".ThirdActivity"
                android:launchMode="singleInstance" /activity>
    

    6. Others

    6.1 使用菜单栏

    1. 在res/menu目录下创建menu文件
    <?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"/>
    <item
        android:id="@+id/remove_item"
        android:title="Remove"/>
    </menu>
    
    1. 重写onCreateOptionsMenu()onOptionsItemSelected()
    @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }        
        /**
         * 处理菜单被选中后的后续处理
         */
        public boolean onOptionsItemSelected(MenuItem munItem){
            String s = munItem.getTitle().toString();//获取选中的标题的字符串
            switch (munItem.getItemId()) {
            case R.id.delete:
                Toast.makeText(this, "你选中了"+s, Toast.LENGTH_LONG).show();//Toast浮动显示提示信息,不获得焦点
                return true;
            case R.id.add:
                Toast.makeText(this, "你选中了"+s, Toast.LENGTH_LONG).show();
                return true;    
            case R.id.find:
                Toast.makeText(this, "你选中了"+s, Toast.LENGTH_LONG).show();
                return true;
            case R.id.name:
                Toast.makeText(this, "你选中了"+s, Toast.LENGTH_LONG).show();
                return true;
            default:
                return super.onOptionsItemSelected(munItem);
            }       
        }   
    

    这次的总结先到这儿,下一次将总结一下《第一行代码》中的UI设计部分,谢谢大家~

    相关文章

      网友评论

          本文标题:第一行代码(1)Activity

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