[Android]-活动Activity

@+id/id_name  //创建id  
@id/id_name   //引用id

创建菜单

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/item_add"
        android:title="ADD"/>
    <item
        android:id="@+id/item_delete"
        android:title="DELETE"/>
</menu>
//创建菜单
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main,menu);
        return true;
    }

    //选中菜单选项后的事件
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.item_add:
                Toast.makeText(this, "Add!!", Toast.LENGTH_SHORT).show();
                break;
            case R.id.item_delete:
                Toast.makeText(this, "Delete!!", Toast.LENGTH_SHORT).show();
                break;
            default:
        }
        return true;
    }

通过隐式intent跳转到浏览器页面

mBtnWebPage=findViewById(R.id.bth_webpage);
        mBtnWebPage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(Intent.ACTION_VIEW);
                intent.setData(Uri.parse("http://www.ywrby.cn"));  //利用这种方法还可以跳转拨号界面,调用地理位置等等
                startActivity(intent);
            }
        });

向下一个/上一个活动传递数据

主页面

package com.example.activitytext;

import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //获取下一个页面返回的数据
        Button bt1=findViewById(R.id.bt_getdata);
        bt1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(MainActivity.this,ReturnDataActivity.class);  //定义intent但是不存储任何数据
                startActivityForResult(intent,1);
                //这里调用的不是常用的startActivity方法,而是可以获得下一个页面返回值的startActivityForResult方法
            }
        });

        //传递数据给下一个页面
        Button bt2=findViewById(R.id.bt_inputdata);
        bt2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String data="This is a data from page1 to page2";
                Intent intent=new Intent(MainActivity.this,GetDataActivity.class);
                intent.putExtra("dataFromPage1",data);  //插入数据,第一个参数是键,用来标明,第二个参数就是数据
                startActivity(intent);  //开启活动
            }
        });
    }


    //下一个页面销毁时会调用这个方法,也就可以通过这个方法获取后一个页面的返回值
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        //requestCode表示请求码,也就是startActivityForResult的第二个参数,用于标记作用
        //data就是从下一个页面返回的intent对象
        switch (requestCode){
            case 1:
                if(resultCode==RESULT_OK){
                    String returnData=data.getStringExtra("dataFromPage2");  //获取指定键的数据
                    Log.d("MainActivity",returnData);  //打出日志信息
                }
                break;
            default:
        }
    }
}

返回给主页面数据的页面

package com.example.activitytext;

import android.content.Intent;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;

import javax.xml.transform.Result;

public class ReturnDataActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_return_data);
        Button bt1=findViewById(R.id.bt_returndata);
        //绑定按钮事件
        bt1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent();
                //定义一个空的intent用于返回数据
                intent.putExtra("dataFromPage2","This is a data from page2");
                //放入数据,第一个参数为键,用于标记,第二个参数就是数据本身
                setResult(RESULT_OK,intent);
                //将intent对象返回,第一个参数就是resultCode,有RESULT_OK,RESULT_CANCLE两种
                finish();
                //销毁页面
            }
        });
    }
}

接收主页面数据的页面

package com.example.activitytext;

import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;

public class GetDataActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_get_data);
        Intent intent=getIntent();
        //注意,这里一定是采用getIntent方法获取上一个页面传递过来的intent对象,否则无法正常获取数据
        String data=intent.getStringExtra("dataFromPage1");  //String类型数据调用intent的getStringExtra方法
        Log.d("MainActivity", data);  //打印日志信息
    }
}

活动的生命周期

返回栈

Android中的活动都是可重叠的,每启动一个新的活动就会覆盖在原来的活动上面,活动采用栈的存储方式,保持先进后出的原则,所以点击back返回键后,最后入栈的栈顶活动会被销毁,显示排在其后的一个活动

活动状态

每个活动在其生命周期内的四种可能状态
1. 运行状态:位于栈顶,正在运行,用户可见,系统最不愿意回收的活动
2. 暂停状态:不在栈顶,仍然可见,系统仍不愿意回收
3. 停止状态:不在栈顶,完全不可见,系统仍然会为其暂时保存相应活动状态和成员变量,但是当其他地方需要内存,系统就会回收处于暂停状态的活动
4. 销毁状态:一个活动从返回栈移除,系统最倾向于挥手的状态

活动的生存期

  • onCreate():活动第一次被创建时调用,完成初始化操作(加载布局,绑定事件等)
  • onStart():活动由不可见变为可见时调用
  • onResume():当活动位于返回栈栈顶,处于运行状态,并且准备与用户进行交互时使用
  • onPause():在准备启动或恢复另一个活动时调用
  • onStop():活动完全不可见时调用
  • onDestroy():活动被销毁前调用
  • onRestart():活动由停止状态变为运行状态时调用

活动的生命周期图例

活动的生命周期

避免活动被回收

已经进入停止状态的活动,很容易由于内存不足原因被系统回收,所以默认情况下,当用户跳转到另一个页面后,按back返回原先界面时,并不是调用onRestart方法重启活动,而是调用onCreate方法重新创建一个活动,这样就可以避免后台回收原活动,返回后程序崩溃的问题发生。

但这样仍然存在一些问题,当我们按返回键返回原页面时,实际上是新创建了一个活动,那么这个活动原来的数据信息都会丢失,用户需要重新输入,为了避免这种情况发生,在返回重建页面时,能够保存这些已输入的数据,可以利用onSaveInstanceState

需要保存的活动重写onSaveInstanceState
@Override
    public void onSaveInstanceState(@NonNull Bundle outState, @NonNull PersistableBundle outPersistentState) {
        super.onSaveInstanceState(outState, outPersistentState);
        String tempData="Somthing you just typed";
        outState.putString("data_key",tempData);
    }
修改onCreate方法使其重新创建时读取原先数据
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("onCreateTag","onCreate");
        setContentView(R.layout.activity_main);
        if(savedInstanceState!=null){
            String temlDta=savedInstanceState.getString("data_key");
            Log.d("onCreateTag",temlDta);
        }
        else{
            ......
        }
    }

活动的启动模式

standard

默认的启动模式,在不进行显式指定的情况下,所有活动都会自动采用这种启动模式

每次启动一个新活动都会将活动直接放入栈顶,并且不论栈中是否已经存在该活动,都选择新建一个活动

singleTop

检查栈顶,加入准备新建的活动与栈顶活动相同,则直接利用栈顶活动,否则创建新活动

singleTask

检查整个栈,如果存在与准备新建的活动相同的活动,就将这个活动之上的所有活动弹出栈内,保证这个活动位于栈顶

singleInstance

启用新的返回栈管理这个活动,方便信息共享

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值