第一行代码笔记①

1.1初识活动

	任何活动都应该重写ActivityonCreate()方法

	最好每一个活动都对应一个布局,通过在布局中添加元素的唯一标识符,可以在代码层面对这个元素进行操作。
	
	比如android:id="@+id/button",如果是在xml中引用id,则是使用@id/id_name
	写好了布局文件以后,可以通过调用setContentView()方法去加载
	
	super.onCreate(savedInstanceState);
    setContentView(R.layout.news_content);
    
    活动需要在AndroidManifest.xml中进行注册。Android Studio会自动帮我们进行注册
    同时我们必须使用<intenr-filter>标签配置好主活动

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

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <meta-data
                android:name="android.app.lib_name"
                android:value="" />
</activity>

1.2在活动中使用Toast

Toast是Android系统提供的一种很好的提醒方式,可以将一些短小的信息通知给用户,过一段时间会自动消失

通过调用ToastmakeText()方法,该方法有三个参数
第一个参数为上下文context,第二个参数为Toast需要显示的内容,第三个参数为显示的时长,有两个内置的常量可以选择。

1.3 在活动中使用Menu

首先在res目录下新建一个menu菜单,并且新建menu.xml
并添加如下代码

 	<item
        android:id="@+id/add_item"
        android:title="Add" />
 	<item
        android:id="@+id/remove_item"
        android:title="Remove" />
接下来需要返回活动,重写onCreateOptionsMenu()方法
@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main,menu);
        return true;
    }
 
通过调用getMenuInflater()方法得到MenuInflater的对象,再调用它的inflate()方法去创建菜单。

第一个参数为所用到的资源文件,当然是当面定义的main.xml文件了。
第二个参数用于指定我们的菜单项添加到哪一个Menu对象,这里使用形参中的menu就行

最后返回true,表示允许创建的菜单显示出来,false则无法显示

上面仅仅让菜单显示还不够,为了让菜单能响应,还需要再定义菜单响应事件。
在活动中重写onOptionsItemSelected()方法
@Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.add_item:
                Toast.makeText(this, "You clicked Add", Toast.LENGTH_SHORT).show();
                break;
            case R.id.remove_item:
                Toast.makeText(this, "You clicked Remove", Toast.LENGTH_SHORT).show();
                break;
            default:
        }
        return true;
    }

上述代码的逻辑为,调用item.getItemId()方法去判断点击的哪一个菜单项,再分别调用Toast展示信息。

1.4 销毁活动

销毁活动可以直接通过Back键
新版Android Studio中可以使用滑动的方式销毁,当然我们也可以在代码层面进行销毁

在监听器中调用finish()方法即可。

1.5 Intent

当有多个活动的时候,需要引入一个新概念,intent

intent是Android程序中各组件之间进行交互的一种重要方式,不仅可以指名当前组件要执行的动作,还可以在不同组件之间传递数据。

一般分为显式intent和隐式intent。




显式intent


@Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, NormalActivity.class);
                startActivity(intent);
            }
这里用到的Intent()方法,需要两个参数。
第一个参数为启动活动的上下文,当然是主活动
第二个参数为目标活动。
上述代码的解读即为:在主活动的基础上,打开目标活动。最后通过startActivity()方法去执行这个intent。

隐式intent


首先在AndroidManifest.xml文件中指定当前活动能够响应的action和category

<intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
只有当action和category同时匹配的时候,才能够响应。

向下一个活动传递数据

第一个活动中有一个字符串,想传到第二个活动中。
@Override
            public void onClick(View v) {
//                Intent intent = new Intent(MainActivity.this, NormalActivity.class);
//                startActivity(intent);
                String data = '';
                Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
                intent.putExtra("extra_data",data);
                startActivity(intent);
            }
        });


然后在第二个活动的onCreate方法中将数据取出来
 setContentView(R.layout.second_layout);
 Intent intent = getIntent();
 String data = intent.getStringExtra("extra_data");
 Log.d("SecondAcitivity", data);

返回数据给上一个活动

既然可以传递数据给下一个活动,也可以返回数据给上一个活动。

需要用到ActivityStartActivityForResult()方法。
该方法需要两个参数,第一个参数还是intent,第二个参数请求码,一般只需要唯一值就行,比如1

还是修改第一个按钮的点击事件

   Intent intent = new Intent(MainActivity.this,NormalActivity.class);
   startActivityForResult(intent,1);

接下来在第二个活动中给按钮注册点击事件
Button button2 = (Button) findViewById(R.id.button_2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra("data_return","Hello FirstActivity");
                setResult(RESULT_OK,intent);
                finish();
            }
        });

这里很重要的一点在于,调用了setResult()方法
第一个参数用于向上一个活动返回处理结果
第二个参数则把带有数据的intent传递回去
然后调用finish()方法去销毁当前的活动。

由于我们是使用 startActivityForResult()方法去启动第二个活动的,第二个活动被销毁之后会回调上一个活动的onActivityResult()方法
因此我们还需要在第一个活动中重写这个方法来得到数据。

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


onActivityResult()方法有三个参数
第一个参数是requestcode,即启动活动中传入的请求码。
第二个参数resultCode,即我们在返回数据时传入的处理结果
第三个参数data,即携带数据的intent。

(重点)参数的含义:
由于我们在一个活动中可能调用startActivityForResult()去启动很多不同的方法,每一个活动返回的数据都可能会回调onActivityResult()这个方法,因此需要通过这个请求码,去判断数据来源。确认好数据来源以后,再通过第二个参数,判断处理结果是否成功,最后从intent中取值。


除了上述的方式,还有一种方法也能返回数据。当用户不是用过点击按钮回到上一个活动,而是通过back键返回。这时候需要在第二个活动中重写onBackPressed()方法。

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

1.6 活动被回收怎么办

思考一个场景,当一个活动A,用户在活动A基础上启动了活动B,活动A进入了停止状态,这个时候由于系统内存不足,活动A回收了。这个时候如果用户按下Back键,会返回活动A,但是并不会执行onRestart()方法,而是执行onCreate()方法,活动A会被重新创建一次。如果活动A之前存在临时数据,比如文本输入框,会导致数据丢失。

为此,Activity提供了一个onSaveInstanceState()方法,可以保证活动被回收之前一定会被调用。
因此我们可以通过这个方法来解决活动被回收时数据得不到保存的问题。

onSaveInstanceState()方法携带一个Bundle类型的参数
Bundle提供了一系列方法用于保存数据,比如putString(),putInt()
每个保存方法都需要传入两个参数,第一个是键,用于后面从Bundle中取值,第二个参数是真正要保存的内容。


在第一个活动中添加如下代码,进行数据保存

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

如何进行数据恢复呢?


 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate");
        setContentView(R.layout.activity_main);


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


    }

onCreate()方法也有一个Bundle类型的参数,这个参数在一般情况下都是null,但是如果活动在被系统回收之前,有通过onSaveInstanceState()去保存数据的话,那个该参数就会带有之前所保存的全部数据,我们只需要再通过相应的取值方法将数据取出即可。

BundleIntent有点类似。还能结合在一起传递数据。

值得注意的是,每个活动执行的时候,都会执行父类的onCreate()方法,下图利用了一个base基类,三个活动均继承自该基类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值