zoukankan      html  css  js  c++  java
  • Android 生命周期,解决savedInstanceState一直为null的问题

    在此之前还是补充下关于监听器的两个要点:

       向下一个活动传递数据 :

      button1.setOnClickListener(new View.OnClickListener() {
      @Override
       public void onClick(View v) {

    String data = "Hello SecondActivity";
    Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
    intent.putExtra("extra1", data);
    startActivity(intent);
    }
      });

    putExtra就是传递数据的方法,参数一就是一个键,接收端只有用这个键才能接受,data就是接受的数据。

      在第二个活动这接收:
      Intent intent=getIntent();
      String data=intent.getStringExtra("extra1");
      Log.d("this",data);

    其实这很像Map的键值对put和get嘛,这边调用,就把data获取过来了,然后就用这边的data接受,输出



      返回数据给上一个活动 :
        这是第二个活动里的,第一个活动可以跳转到第二个,
          
    Button bt2=findViewById(R.id.button2);
    bt2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    Intent intent=new Intent();
    intent.putExtra("data_return","there has nothing!!!");
    setResult(RESULT_OK,intent);
    finish();
    }
    });

    setResult主要是为了给下面重写的那个onActivityResult方法准备的,

    然后把数据返回给第一个活动:
    第一个活动就是先写监听器: 
    bt.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    Intent intent=new Intent(MainActivity.this,Main2Activity.class);
    startActivityForResult(intent,2);
    }
    });

    这边第一个活动,就是监听的时候注意用startActivityForResult,才能传值,那个2,其实也是给重写的方法准备的onActivityResult
    这个重写的方法,可以看出它的三个参数,首先就是startActivityForResult里的那个数字,然后就是第二个活动里的setResult那个常量RESULT_OK,最后一个就是Intent的数据,就是意图
    联系起来
    startActivityForResult(intent,2);以及setResult(RESULT_OK,intent);都是为onActivityResult做准备的

    然后再重写下
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode){
    case 2:
    if (resultCode == RESULT_OK)
    {
    String returnedData = data.getStringExtra("data_return");
    // Log.d("FirstActivity", returnedData);
    Log.d("MainActivity",returnedData);
    }
    break;
    default:break;
    }
    }
    这是接收数据的,很长。
      

    接下来正式进入生命周期的学习,智商不合格的本牛崽在这徘徊了良久。
    因为每个窗口的打开都相当于放进了栈里,栈是先进后出的。
    打个比方,页面1,2,3分别打开。
    1在栈底,它最先打开,当2,3没打开时,它是不是在栈顶,就是可以操作的界面,然后2,3来了,
    它就被压下去了,这个时候3是栈顶,如果3出栈,那么栈顶就是2,以此类推,最后栈顶是1,然后空栈结束。
    (如果还不清楚,可以用一个软件来测试,应该很快就可以看出其中的规律了)

    各个活动之间的关系就存在返回栈(task)

     


    活动状态 :

    分别是运行状态,暂停状态,停止状态,销毁状态。

    运行状态就是task栈顶的时候(用户当前看到的界面),此时它是活动的,如果你突然给它来个闪退,也就是销毁状态,你会不会暴走?

    如果给你来个暂停状态(网络不行了),你会不会咬牙切齿

    停止状态大概就是挂后台吧(个人见解,有不同意见可以评论,直接纠正我,万一误人子弟就不好了)

     活动的生存期 

    七个,

    我们新手一般只见过onCreate吧。

    下面的就是活动的生命周期

     

    其实我们一般只重写了onCreate,其他的都没重写,但是一些功能还是运行了的,

    下面的是体现生命周期的代码:

    思路就是两个按钮跳转到不同的页面,跳转前后生命周期的变化。

    跳转的话你们自己实现吧

    其中TAG是Log.d里的目标,因为直接在主活动写的,就定义了常量TAG

    @Override
    protected void onStart() {
    super.onStart();
    Log.d(TAG,"onStart");
    }

    @Override
    protected void onResume() {
    super.onResume();
    Log.d(TAG,"onResume");

    }

    @Override
    protected void onPause() {
    super.onPause();
    Log.d(TAG,"onPause");

    }

    @Override
    protected void onStop() {
    super.onStop();
    Log.d(TAG,"onStop");

    }

    @Override
    protected void onDestroy() {
    super.onDestroy();
    Log.d(TAG,"onDestroy");
    }

    @Override
    protected void onRestart() {
    super.onRestart();
    Log.d(TAG,"onRestart");
    }


    活动被回收了怎么办 :
    我们为啥要考虑活动被回收的问题?
    因为如果我们在登录用户,突然就被回收了,那我们的数据就都消失了,又得重新输入用户名和密码,导致用户体验不舒适。
    所以我们得重写一个方法onSaveInstanceState。
    这就是本牛崽遇到的头疼的问题,网上搜了好一会都没找到,后面才知道是模拟器不行,之后就傻乎乎的用手机测试了,才成功。

    这个方法是需要触发才能运行的,本牛崽就一直在折腾这个触发,
    先上代码:
    重写方法:
    protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putString("data_key","Something you just typed");
    }
    有点像Intent意图的值的传递,这就是个键值对。
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d(TAG,"onCreate");
    setContentView(R.layout.activity_main);
    if(savedInstanceState !=null){
    String data=savedInstanceState.getString("data_key");
    Log.d(TAG,data);
    System.out.println(data);
    }
    }

     刚开始,这个onCreate是我给的Log.d,

    颤抖的手啊

     

    手机端调试才能成功输出了我的那句Something you just typed,我的难题就这样解决的。可笑不?

    然后在创建时,也就是登录用户时,如果突然回收,我们可以把当时存下的数据放回去。
    如果实在不懂这个是啥的,建议去搜搜onSaveInstanceState。
    https://www.jianshu.com/p/27181e2e32d2,这个大牛写的很详细,就连它兄弟都介绍了。



    再一笔带过这个活动的启动模式 

    https://www.jianshu.com/p/b4472dc6911e奉上大牛的神笔。


    基本上是理论,就不上操作的图了
  • 相关阅读:
    帆软报表实现全选全不选的功能
    knowledge_others
    skills_kafka
    skills_operation
    problems_others
    skills_windows
    c语言标识符
    快速排序法
    字符串处理scanf("%d%*c",&n);
    Byte.parseByte(String s,int radix)的解释
  • 原文地址:https://www.cnblogs.com/aolong/p/12885077.html
Copyright © 2011-2022 走看看