第一行代码(1)Activity

2019-10-21  本文已影响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个部分,分别是:

一些常见事件执行的生命周期
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种

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设计部分,谢谢大家~

上一篇下一篇

猜你喜欢

热点阅读