您的位置 首页 golang

物联网实战教程3.4,Intent与Activity生命周期

物联网系列教程

一个很好的物联网(IoT)开发实战入门教程,图、文详细。供计算机、电子工程相关专业的在校生以及相关领域初学者、爱好者参考学习。涉及单片机、上位机、移动应用、服务器后台开发的知识,以及蓝牙4.0、以太网模块的使用实例。

从本章开始,将要进入移动开发的世界——安卓开发。安卓程序需要基于面向对象的Java语言进行开发,读者需要了解XML的使用,最好有过面向对象的基础,并且最好了解一下Java语言。另外,由于安卓是Google出品,请准备好梯子。

目录

第一部分:基础入门

第1项:单片机开发——Arduino

  • 1.1 Arduino开发环境搭建(往期文章)
  • 1.2 点亮一个Led(往期文章)
  • 1.3 PWM操作(往期文章)
  • 1.4 UART的使用(往期文章)
  • 第2项:上位机开发——.Net

  • 2.1 winform快速入门(往期文章)
  • 2.2 serialport控件使用(往期文章)
  • 第3项:移动开发——Android

  • 3.1 安卓开发环境搭建(往期文章)
  • 3.2 HelloActivity分析(往期文章)
  • 3.3 LinearLayout与基本控件(上期文章)
  • 3.4 Intent与Activity的生命周期( 本期文章
  • 3.5 ListView与BaseAdapter( 下期文章更新 ,两天更新一期)
  • 3.6 Service学习
  • 3.7 Android权限机制
  • 3.8 BroadCastReciever学习
  • 第4项:后端开发——Golang

  • 4.1 go语言开发环境搭建
  • 4.2 go语言基础快速入门
  • 4.3 用go语言显示一个网页
  • 4.4 go语言web框架——gin
  • 4.5 部署go语言项目
  • 第二部分:案例学习

    第5项:蓝牙4.0案例——手机控制RGB灯颜色

  • 5.1 用串口控制RGB灯颜色
  • 5.2 用上位机控制RGB灯颜色
  • 5.3 蓝牙4.0简单介绍
  • 5.4 蓝牙4.0安卓例程源码阅读
  • 5.5 用安卓手机控制RGB灯颜色
  • 第6项:网络模块案例——温度采集系统开发

  • 6.1 Arduino温度传感器的使用
  • 6.2 ENC28J60模块的使用
  • 6.3 在网页上显示温度

  • 3.4 Intent与Activity的生命周期

    这一节将介绍Intent,如何查api文档以及Activity的生命周期。

    Intent

    intent的中文意思大概是目的、意图的意思。它可以用来做Activity的跳转,也就是从一个Activity跳转到另一个Activity。

    页面跳转

    我们继续在之前的SecondActivity里面编写代码,先来实现跳转到从第一个SecondActivity跳转到MainActivity。

    为了简化操作,我们修改一下布局和代码,让SecondActivity上只显示一个Button。用户点击Button后,从SecondActivity跳转到MainActivity中。

    activity_second.xml:

     <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="#34;
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <Button
            android:id="@+id/button"
            android:text="点击"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>  

    SecondActivity.java:

     package com.example.kalen.helloactivity;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    
    
    public class SecondActivity extends AppCompatActivity{
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_second);
    
            Button button = (Button) findViewById(R.id.button);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent();
                    intent.setClass(SecondActivity.this, MainActivity.class);
                    startActivity(intent);
                }
            });
        }
    }  

    在onClick方法中,我们通过startActivity方法,实现SecondActivity到MainActivity的跳转。

    这里主要要说明一下:intent.setClass(SecondActivity.this, MainActivity.class)这块。第一个参数代表着一个类的实例,也就是SecondActivity的一个实例,代表着当前界面的Activity,它已经被创建出来了,所以是一个实例。第二个是一个类,因为我们还没有创建这个实例呢,这个实例由系统帮我们创建,所以传一个class。

    页面传值

    那么,我们应该如何给第二个Activity传值呢?因为第二个Activity不是由我们new出来的,所以不能拿到真正的对象。这就需要intent的一个putExtra的方法。具体如下:

     public void onClick(View v) {
        Intent intent = new Intent();
        intent.setClass(SecondActivity.this, MainActivity.class);
        intent.putExtra("data", "this is data");
        startActivity(intent);
    }  

    这里加了一行putExtra,存入了一个String。在MainActivity.java中,可以通过getIntent().getStringExtra(“data”))把data的值取出来。

     protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        System.out.println("In MainActivity--->" + getIntent().getStringExtra("data"));
    }  

    DDMS的使用

    上面的代码直接通过System.out.println直接打印了出来。如何看到打印的结果呢?

    我们点击Android Studio上方的菜单,选择Tools->Android->Android Device Monitor。

    点击过后我们就进入了DDMS(Dalvik Debug Monitor Service),在DDMS的下方有一个logcat,我们把下方的窗口拉到中间,可以看到很多的日志。这些都是Android 系统的

    不过默认显示的是所有的日志,实在是太多了,我们来添加一个过滤器,把HelloActivity的日志信息过滤出来。

    下面我们点击绿色的+,添加我们HelloActivity的过滤信息。

    这时候,我们点击Android Studio上的运行按钮,发现程序跑不起来了。

    我发现instant run(可以快速运行应用的机制) 和DDMS有冲突,我们打开菜单File->Settings,打开配置窗口,搜索instant run,把instant run关掉。

    选择Apply保存设置。

    再次运行,我们看到成功运行出来了,我们点击button,查看DDMS的logcat,可以看到成功打印出了传到MainActivity的值。

    另外,除了放String之外,还可以放很多类型,比如说Serializable、Parcelable、Bundle等等,读者可以自行百度了解。

    使用安卓API文档

    到现在,也算学习了一些安卓了,不过到现在,还没有讲和安卓文档相关的东西,下面开始介绍一下安卓的文档。
    首先,我们打开Android sdk的安装路径。在sdk目录下,有一个docs的文件夹,如下:

    我们用浏览器打开offline.html。

    然后我们点击上面标题栏的Develop。

    我们可以看看Develop里的Training,这是一个官方给的一套安卓教程,如下:

    这套教程十分推荐学习。不过我们要找的文档并不在这里,选择第三个Reference。

    然后选择See all API classes,来查看类的介绍。

    这里显示的就是安卓里面所有的类了,我们往后拉,找到Activity(我们虽然之前用的都是AppCompatActivity,这里只介绍Activity)。

    我们可以看到,这里给了Activity的介绍:An activity is a single, focused thing that the user can do. 。就是说Activity是和用户交互的东西。我们点击进去之后,就可以看到Activity这个类的详细文档了。

    Activity的生命周期

    我们知道如何查找API之后,我们找到Activity下面的Activity Lifecycle部分的开头,看看原文

    Activities in the system are managed as an activity stack. When a new activity is started, it is placed on the top of the stack and becomes the running activity — the previous activity always remains below it in the stack, and will not come to the foreground again until the new activity exits.

    我稍微翻译一下:在安卓系统中,Activity是使用栈进行管理的。当一个新的Activity启动时,它会被放到堆栈的栈顶,而栈顶这个就是正在运行的Activity。在新的Activity没有结束前,之前的的Activity就不会跑到前台显示出来。

    比如之前启动的通过SecondActivity启动了MainActivity,此时按下BACK键的话,又会回到SecondActivity中。如下所示:

    再往后看,可以看到这张图,这张图就是Activity的生命周期的方法调用流程。

    在图的下面,有一段解释的话,看懂这些,相当于对Activity的生命周期就了解了,我在这里大概翻译一下。

    The entire lifetime of an activity happens between the first call to onCreate(Bundle) through to a single final call to onDestroy(). An activity will do all setup of “global” state in onCreate(), and release all remaining resources in onDestroy(). For example, if it has a thread running in the background to download data from the network, it may create that thread in onCreate() and then stop the thread in onDestroy().

    Activity的整个生命周期是在调用onCreate和onDestroy之间。一个Activity会在onCreate中做全局的初始化工作,并且在onDestroy时释放资源。例如,如果有一个线程在后台下载东西,如果在onCreate方法中开启这个线程,(如果没有手动结束这个线程的话)在onDestory就会把这个线程停掉。(显然,我们如果做一个APP需要后台一直下载东西,就不能使用Activity来实现了,后面会介绍到Service)

    The visible lifetime of an activity happens between a call to onStart() until a corresponding call to onStop(). During this time the user can see the activity on-screen, though it may not be in the foreground and interacting with the user. Between these two methods you can maintain resources that are needed to show the activity to the user. For example, you can register a BroadcastReceiver in onStart() to monitor for changes that impact your UI, and unregister it in onStop() when the user no longer sees what you are displaying. The onStart() and onStop() methods can be called multiple times, as the activity becomes visible and hidden to the user.

    Activity可见的周期是在onStart和onStop之间。当用户可以看到这个Activity在屏幕时,即使它不在最显眼的地方或者与用户有交互,这个时期也是在onStart和onStop之间的。在这两个方法之间,你可以提供一些你需要展示给用户的资源。(接下来的举例是讲BroadcastReceiver 的,后面再做介绍)

    The foreground lifetime of an activity happens between a call to onResume() until a corresponding call to onPause(). During this time the activity is in front of all other activities and interacting with the user. An activity can frequently go between the resumed and paused states — for example when the device goes to sleep, when an activity result is delivered, when a new intent is delivered — so the code in these methods should be fairly lightweight.

    foreground lifetime这里可以理解为真正和用户交互的时期,而这个时期是在onResume和onPause之间。在这个时期,Activity在所有其他Activity的前面(这块后面会举例),并且和用户做交互。Activity经常经过继续和暂停的状态(也就是经常会调用onResume和onPause方法)。(下面的举例这里先不解析)

    接下来要开始举例了,主要是先对单个Activity的运行流程做分析,然后针对visible lifetime和foreground lifetime加以区别,这里,先给SecondActivity和MainActivity添加一下生命周期方法,并且加入打印信息。

    SecondActivity.java:

     package com.example.kalen.helloactivity;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    
    
    public class SecondActivity extends AppCompatActivity{
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_second);
    
            Button button = (Button) findViewById(R.id.button);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent();
                    intent.setClass(SecondActivity.this, MainActivity.class);
                    intent.putExtra("data", "this is data");
                    startActivity(intent);
                }
            });
            System.out.println("SecondActivity--->onCreate");
        }
    
        protected void onStart(){
            super.onStart();
            System.out.println("SecondActivity--->onStart");
        }
    
        protected void onRestart(){
            super.onRestart();
            System.out.println("SecondActivity--->onRestart");
        }
    
        protected void onResume(){
            super.onResume();
            System.out.println("SecondActivity--->onResume");
        }
    
        protected void onPause(){
            super.onPause();
            System.out.println("SecondActivity--->onPause");
        }
    
        protected void onStop(){
            super.onStop();
            System.out.println("SecondActivity--->onStop");
        }
    
        protected void onDestroy(){
            super.onDestroy();
            System.out.println("SecondActivity--->onDestroy");
        }
    }  

    MainActivity.java:

     package com.example.kalen.helloactivity;
    
    import android.support.v7.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);
    //        System.out.println("In MainActivity--->" + getIntent().getStringExtra("data"));
            System.out.println("MainActivity--->onCreate");
        }
        protected void onStart(){
            super.onStart();
            System.out.println("MainActivity--->onStart");
        }
    
        protected void onRestart(){
            super.onRestart();
            System.out.println("MainActivity--->onRestart");
        }
    
        protected void onResume(){
            super.onResume();
            System.out.println("MainActivity--->onResume");
        }
    
        protected void onPause(){
            super.onPause();
            System.out.println("MainActivity--->onPause");
        }
    
        protected void onStop(){
            super.onStop();
            System.out.println("MainActivity--->onStop");
        }
    
        protected void onDestroy(){
            super.onDestroy();
            System.out.println("MainActivity--->onDestroy");
        }
    }  

    为两个Activity添加后生命周期方法后,就可以看看这些生命周期方法的调用顺序了。我们运行程序,查看logcat。

    接下来,启动点击Button,启动MainActivity看看结果。

    这里SecondActivity已经不可见了,所以调用了onStop方法,visible lifetime已经结束了。

    然后我们点击Android的Back键,把栈顶的MainActivity弹出来,可以看到SecondActivity调用了Restart,而MainActivity调用了onDestroy方法。

    接下来,我们看看foreground lifetime是什么情况。我们打开res/values/styles.xml,添加一个新的Theme:AppTheme2。

     <resources>
    
        <!-- Base application theme. -->
        <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
            <!-- Customize your theme here. -->
            <item name="colorPrimary">@color/colorPrimary</item>
            <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
            <item name="colorAccent">@color/colorAccent</item>
        </style>
    
        <style name="AppTheme2" parent="Theme.AppCompat.Dialog"> </style>
    
    </resources>  

    然后打开AndroidManifest.xml,为MainActivity标签添加theme,这样MainActivity就变成Dialog样式了。

     <activity
        android:name=".MainActivity"
        android:theme="@style/AppTheme2">
    </activity>  

    这样新打开的MainActivity就不会充满整个屏幕了,只是在最前台的位置,但是SecondActivity也可以看到。运行程序后,可以看到这样:

    再来看看logcat打印的信息:

    我们发现,这回没有调用SecondActivity的onStop方法,只是调用了它的onPause方法。也就是经历了foreground lifetime。


    下期更新预告:

    第1部分:单片机开发——Arduino

  • 第2项:上位机开发——.Net

  • 第3项:移动开发——Android

  • 3.4 Intent与Activity的生命周期( 本期文章
  • 3.5 ListView与BaseAdapter( 下期更新这部分内容
  • 三连加关注,往后不迷路

    往期哪里搞,上面找一找

    文章来源:智云一二三科技

    文章标题:物联网实战教程3.4,Intent与Activity生命周期

    文章地址:https://www.zhihuclub.com/99855.shtml

    关于作者: 智云科技

    热门文章

    网站地图