Android开发秘籍学习笔记(一)-程序员宅基地

技术标签: Android开发秘籍笔记  android  

  该目录为Android的一些学习笔记。

Android四大组件之—-Activity

  Android中有4大组件,它们分别是Activity、Service、BroadcastReceiver、ContentProvide。它们的功能如下表:

这里写图片描述

  要学Activity首先肯定要了解Activity的生命周期,首先我们看Android官方API的介绍:
这里写图片描述
  先来了解下,Activity中重要的四种状态和七种方法
一)四种状态
1. 活动(Active/Running)状态
当Activity运行在屏幕前台(处于当前任务活动栈的最上面),此时它获取了焦点能响应用户的操作,属于运行状态,同一个时刻只会有一个Activity 处于活动(Active)或运行

  1. 暂停(Paused)状态
    当Activity失去焦点但仍对用户可见(如在它之上有另一个透明的Activity或Toast、AlertDialog等弹出窗口时)它处于暂停状态。暂停的Activity仍然是存活状态(它保留着所有的状态和成员信息并保持和窗口管理器的连接),但是当系统内存极小时可以被系统杀掉

  2. 停止(Stopped)状态

完全被另一个Activity遮挡时处于停止状态,它仍然保留着所有的状态和成员信息。只是对用户不可见,当其他地方需要内存时它往往被系统杀掉

  1. 非活动(Dead)状态

Activity 尚未被启动、已经被手动终止,或已经被系统回收时处于非活动的状态,要手动终止Activity,可以在程序中调用”finish”方法

二)七种方法
通常用于初始化设置: 1、为Activity设置所要使用的布局文件2、为按钮绑定监听器等静态的设置操作

  onCreate(Bundle savedInstanceState);

当Activity可见未获得用户焦点不能交互时系统会调用

  onStart();

当Activity已经停止然后重新被启动时系统会调用

  onRestart();

当Activity可见且获得用户焦点能交互时系统会调用

  onResume();

  当系统启动另外一个新的Activity时,在新Activity启动之前被系统调用保存现有的Activity中的持久数据、停止动画等,这个实现方法必须非常快。当系统而不是用户自己出于回收内存时,关闭了activity 之后。用户会期望当他再次回到这个activity 的时候,它仍保持着上次离开时的样子。此时用到了onSaveInstanceState(),方法onSaveInstanceState()用来保存Activity被杀之前的状态,在onPause()之前被触发,当系统为了节省内存销毁了Activity(用户本不想销毁)时就需要重写这个方法了,当此Activity再次被实例化时会通过onCreate(Bundle savedInstanceState)将已经保存的临时状态数据传入因为onSaveInstanceState()方法不总是被调用,触发条件为(按下HOME键,按下电源按键关闭屏幕,横竖屏切换情况下),你应该仅重写onSaveInstanceState()来记录activity的临时状态,而不是持久的数据。应该使用onPause()来存储持久数据。

onPause();

当Activity被新的Activity完全覆盖不可见时被系统调用

  onStop();

当Activity(用户调用finish()或系统由于内存不足)被系统销毁杀掉时系统调用,(整个生命周期只调用1次)用来释放onCreate ()方法中创建的资源,如结束线程等

  onDestroy();

  我自己本来也想个写了实例测试,发现网上早有大神测试过了,故我这里就不自己来了,直接将两分钟彻底让你明白Android Activity生命周期(图文)!
应用过来,这里基本讲全了,我这里补充点屏幕切换时的生命周期以及Activity切换时的状态变化。
  在横竖屏切换时,网上有人是这么说的
1、运行Activity,得到如下信息

onCreate–>
onStart–>
onResume–>

2、按crtl+f12切换成横屏时

onSaveInstanceState–>
onPause–>
onStop–>
onDestroy–>
onCreate–>
onStart–>
onRestoreInstanceState–>
onResume–>

3、再按crtl+f12切换成竖屏时,发现打印了两次相同的log

onSaveInstanceState–>
onPause–>
onStop–>
onDestroy–>
onCreate–>
onStart–>
onRestoreInstanceState–>
onResume–>
onSaveInstanceState–>
onPause–>
onStop–>
onDestroy–>
onCreate–>
onStart–>
onRestoreInstanceState–>
onResume–>

4、修改AndroidManifest.xml,把该Activity添加android:configChanges=”orientation”,执行步骤3

onSaveInstanceState–>
onPause–>
onStop–>
onDestroy–>
onCreate–>
onStart–>
onRestoreInstanceState–>
onResume–>

5、再执行步骤4,发现不会再打印相同信息,但多打印了一行onConfigChanged

onSaveInstanceState–>
onPause–>
onStop–>
onDestroy–>
onCreate–>
onStart–>
onRestoreInstanceState–>
onResume–>
onConfigurationChanged–>

6、把步骤5的android:configChanges=”orientation” 改成 android:configChanges=”orientation|keyboardHidden”,执行步骤3,就只打印onConfigChanged

onConfigurationChanged–>

7、执行步骤4

onConfigurationChanged–>
onConfigurationChanged–>

总结:

1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

2、设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

3、设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
但是我用Genymotion测试后发现得到的结果和他有些差距。首先启动Activty同样是
这里写图片描述
我切换成横屏也和他一样
这里写图片描述
但是我切换回竖屏是却不是他说的会打印2次
这里写图片描述
之间的原因我怀疑是模拟器的问题。
  在Activity切换时,状态变化则是
启动第一个界面Activity One时,它的次序是

         onCreate (ONE) - onStart (ONE) - onResume(ONE)

打开第二个Activity:

   onPause(ONE) - onCreate(TWO) - onStart(TWO) - onResume(TWO)

Back后第一个Activity:

onPause(TWO) - onActivityResult(ONE) - onResume(ONE) - onStop(TWO) - onDestroy(TWO)

最后是按下HOME键:
这里写图片描述

Activity中数据传递的方法
1、使用剪切板方式clipboardManager
Activity A 中的内容传值到Activity B
A中代码:

String name = "XXXXXXXX";
ClipboardManager cm = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);  
         cm.setText();  
         Intent in = new Intent(MainActivity.this, Other.class);  
         startActivity(in);  

B中代码:

ClipboardManager cm = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);
cm.getText();

2、使用intent传值
方法一:只需传递少量参数
Activity A 中的内容传值到Activity B
A中代码:

Intent intent = new Intent();
                intent.setClass(getApplicationContext(), SecondActivity.class);
                intent.putExtra("username","Cui");
                startActivity(intent);

B中代码:

Intent intent2 = getIntent();
        String str = intent2.getStringExtra("username");
        textview2.append(str);

方法二:通过Bundle封装数据进行传递
Activity A 中的内容传值到Activity B
A中代码:

Intent intent=new Intent();  
 intent.setClass(OneActivity.this, OtherActivity.class);  
Bundle bundle = new Bundle();
                bundle.putString("user", "Cui");
                bundle.putInt("number", 12312);
                intent.putExtras(bundle);
startActivity(intent)

B中代码:

Bundle bundle = new Bundle();
        bundle = intent2.getExtras();
        String str4 = bundle.getString("user");
        int num = bundle.getInt("number");
        textview4.append(str4 + num);

3、使用Application
  在Android中,有一个名为Application的类,我们可以在Activity中使用getApplication(),方法来获得,它是代表我们的应用程序的类,使用它可以获得当前应用的主题,资源文件中的内容等,这个类更灵活的一个特性就是可以被我们继承,来添加我们自己的全局属性。
使用方法为继承Application,定义所需类型变量,定义对应的get 和 put 方法即可

/**************************************************/

  之前我们都是使用startActivity(intent)进行Activity之间的切换,还有一种常用的Activity切换的方法是startActivityForResult(intent, requestCode)

startActivityForResult:
  startActivityForResult的主要作用就是它可以回传数据,可以一次性完成这项任务,当程序执行到这段代码的时候,假若从T1Activity跳转到下一个TActivity,而当这个T2Activity调用了finish()方法以后,程序会自动跳转回T1Activity,并调用前一个T1Activity中的onActivityResult( )方法。
  这里需要注意的还有两个方法—–onActivityResult(int requestCode, int resultCode, Intent data),setResult(int resultCode, Intent data)。下面将直接在例子中说明各个函数的使用。

Activity First:

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

@SuppressLint("NewApi")
public class MainActivity extends Activity {
    

    TextView tv1;
    Button btn1,ed_btn1,ed_btn2;
    EditText ed_text1,ed_text2;
    Intent intent;
    private int requestCode; 


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i("MainActivity", "onCreate ~~~~");
        btn1 = (Button) findViewById(R.id.btn1);
        intent = new Intent();
        intent.setClass(getApplicationContext(), SecondActivity.class);
        btn1.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                intent.putExtra("username","Cui");
                intent.putExtra("password", "Did you love me");
                ClipboardManager cm = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
                cm.setText("ClipboardManager传递的参数");

                Bundle bundle = new Bundle();
                bundle.putString("user", "Cui");
                bundle.putInt("number", 12312);
                intent.putExtras(bundle);


                startActivity(intent);
            }
        });

        ed_text1 = (EditText) findViewById(R.id.ed_text1);
        ed_text2 = (EditText) findViewById(R.id.ed_text2);
        ed_text1.setText("EditText 01 ");
        ed_text2.setText("EditText 02 ");


        ed_btn1 = (Button) findViewById(R.id.ed_btn1);
        ed_btn2 = (Button) findViewById(R.id.ed_btn2);

        ed_btn1.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                 requestCode = 1;
                 startActivityForResult(intent, requestCode);
            }
        });

        ed_btn2.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                requestCode = 2;
                startActivityForResult(intent, requestCode);
            }
        });

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        String text1 = data.getStringExtra("ed_text1");
        String text2 = data.getStringExtra("ed_text2");

        switch (resultCode) {
        case RESULT_OK:
            if(requestCode == 1){
                ed_text1.setText(text1);
            }
            else{
                ed_text2.setText(text2);
            }
            break;
        default:  
            break; 
        }

    }
}

Activity Second:

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

public class SecondActivity extends Activity {

    TextView textview2,textview3,textview4;

    @SuppressLint("NewApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);

        textview2 = (TextView) findViewById(R.id.textview2);
        textview3 = (TextView) findViewById(R.id.textview3);
        textview4 = (TextView) findViewById(R.id.textview4);

        Intent intent2 = getIntent();
        String str = intent2.getStringExtra("username");
        String str2 = intent2.getStringExtra("password");
        textview2.append(str + str2);
        ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
        String str3 = (String) cm.getText();
        textview3.append(str3);

        Bundle bundle = new Bundle();
        bundle = intent2.getExtras();
        String str4 = bundle.getString("user");
        int num = bundle.getInt("number");
        textview4.append(str4 + num);

        Intent intent3 = new Intent();
        intent3.putExtra("ed_text1", "我改变了EditText1的值");
        intent3.putExtra("ed_text2", "我改变了EditText2的值");
        setResult(RESULT_OK, intent3);
    }
}

  运行程序后,点击”go to next Activity”
这里写图片描述
  将在SecondActivity中显示各种传递Activity传递数据的方法结果。
这里写图片描述
BACK键返回,MainActivity后点击EditText下面的两个Button
进入SecondActivity后在BACK键返回MainActivity,得到
这里写图片描述

至此,关于Activity的知识学习到此。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cuihaoren01/article/details/45558279

智能推荐

web前端开发工程师必会12 个 CSS 高级技巧汇总-程序员宅基地

文章浏览阅读598次,点赞8次,收藏21次。SVG对所有的分辨率类型都具有良好的扩展性,并支持所有浏览器都回归到IE9。此外,IE /Edge没有 text-rendering 支持。(img-6ATQswJy-1712011537765)](img-aiCZDix0-1712011537766)](img-V8ixKhta-1712011537766)]中使用负的 nth-child 选择项目1到项目n。对最后一个列表项使用 :not() 伪类。注:在IE11中要小心flexbox。这样代码就干净,易读,易于理解了。然后再除去最后一个元素……

大数据信用报告应该去哪里查询比较好呢?-程序员宅基地

文章浏览阅读887次,点赞26次,收藏9次。小易大数据平台是一个集数据采集、整合、分析、应用于一体的智能平台,它拥有丰富的数据源、先进的数据处理技术和专业的服务团队,能够提供全面、准确、高效的大数据信用报告查询服务。如果您需要查询大数据信用报告,不妨选择小易大数据平台。依法采集、整理、保存、加工自然人、法人及其他组织的信用信息,并对外提供信用报告、信用评估、信用信息咨询等服务,帮助客户判断、控制信用风险,进行信用管理的活动。专业报告解读服务:小易大数据平台拥有一支专业的服务团队,能够为用户提供个性化的服务,并根据用户需求进行定制化的大数据解决方案。

微信程序开发之微信接入_/zxjk?useunicode=true&characterencoding=utf8&serve-程序员宅基地

文章浏览阅读847次,点赞9次,收藏16次。一次偶然,从朋友那里得到一份“java高分面试指南”,里面涵盖了25个分类的面试题以及详细的解析:JavaOOP、Java集合/泛型、Java中的IO与NIO、Java反射、Java序列化、Java注解、多线程&并发、JVM、Mysql、Redis、Memcached、MongoDB、Spring、Spring Boot、Spring Cloud、RabbitMQ、Dubbo 、MyBatis 、ZooKeeper 、数据结构、算法、Elasticsearch 、Kafka 、微服务、Linux。_/zxjk?useunicode=true&characterencoding=utf8&servertimezone=gmt%2b8&usessl=f

Tomcat服务器的安装和介绍_网站安装tomcat是安装前台服务器还是后台(2)-程序员宅基地

文章浏览阅读193次,点赞4次,收藏2次。配置CATALINA_HOME:tomcat的安装路径(举例:D:\Tomcat\tomcat8.0\apache-tomcat-8.0.32)备注:检测tomcat服务器是否安装配置成功可以在浏览器输入localhost:8080地址访问一下.配置Path环境变量:%CATALINA_HOME%\lib;protocol=“HTTP/1.1” //使用协议版本。servlet服务器:比如tomcat、jetty。http服务器:比如apache、nginx。port=“8080” //监听端口。

【全开源】JAVA游戏陪玩系统源码陪练APP源码H5源码电竞系统源码支持Android+IOS+H5_博纳软云-程序员宅基地

文章浏览阅读465次,点赞7次,收藏3次。其次,系统内置了智能匹配算法,能够根据玩家的游戏水平和喜好,为其推荐合适的陪练,实现精准匹配。随着游戏产业的不断发展和玩家需求的日益多样化,JAVA游戏陪玩系统源码陪练将拥有更加广阔的发展前景。同时,系统还将不断拓展新的游戏类型和功能模块,满足更多玩家的需求,实现陪玩服务的全面升级。综上所述,JAVA游戏陪玩系统源码陪练以其卓越的优势和便捷的搭建方式,为游戏陪玩行业的发展提供了有力支持。JAVA游戏陪玩系统源码陪练,以其卓越的优势和便捷的搭建方式,为游戏陪玩行业注入了新的活力。

【Python】Anaconda以及Pip配置清华镜像源_anaconda 清华镜像-程序员宅基地

文章浏览阅读1.1k次,点赞9次,收藏28次。最近换了新电脑,在使用Anaconda安装Python包时,系统会自动从默认源下载安装包,但是由于网络访问限制或网络连接速度较慢等原因,会导致安装失败或安装速度较慢。因此,为了提高安装速度和稳定性,一些用户选择使用国内的镜像源,如清华镜像源。配置清华镜像源可以让用户从国内的服务器上下载Python包,这可以加快下载速度,并减少由于网络访问限制导致的下载失败等问题。_anaconda 清华镜像

随便推点

(免费赠源码)计算机毕设题目:92767 PHP酒店预约管理系统(开题答辩+程序定制+全套文案 )上万套实战教程手把手教学JAVA、PHP,node.js,C++,大屏可视化等-程序员宅基地

文章浏览阅读1.5k次,点赞41次,收藏29次。免费领取项目源码,请关注●点赞●收藏并私信博主,谢谢~本酒店预约管理系统采取Mysql作为后台数据的主要存储单元,采用Thinkphp框架、Redis技术进行业务系统的编码及其开发,实现了本系统的全部功能。在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。

学习Git与JSON_git学习周报-程序员宅基地

文章浏览阅读270次。项目准备_git学习周报

npm install node-sass安装失败的解决方案_npm报node-sass失败-程序员宅基地

文章浏览阅读647次,点赞6次,收藏6次。这样一来就是指定node-sass版本,指定npm包下载源为淘宝源,指定sass下载源为淘宝源,使用此命令基本就都能安装成功了。由于国内网络环境的问题,这个下载时间可能会很长,甚至导致超时失败。参数指定npm包的下载源是不够的,还需要使用。根据版本对应关系,笔者应该安装。命令默认安装了撰写本文时的。,所以才有了前文中报错。的对应关系,读者可访问。版本不同,需要安装的。官方给出了不同版本的。的版本时,默认会安装。_npm报node-sass失败

【DP】最佳浏览路线问题-程序员宅基地

文章浏览阅读1.6k次。最佳浏览路线问题题目某旅游区的街道成网格状,其中东西向的街道都是旅游街,南北向的街道都是林荫道。由于游客众多,旅游街被规定为单行道。游客在旅游街上只能从西向东走,在林荫道上既可以由南向北走,也可以从北向南走。阿隆想到这个旅游区游玩。他的好友阿福给了他一些建议,用分值表示所有旅游街相邻两个路口之间的道路值得浏览得程度,分值从-100到100的整数,所有林荫道不打分。所有分值不可能全是负值。例如..._最佳浏览路线问题

Python函数结构_python函数的组成部分中包含( )。(多选题) a.定义函数的关键字 def b.函数体 c.r-程序员宅基地

文章浏览阅读992次,点赞17次,收藏15次。1. 定义函数基本结构是:def functionname( parameters ): "函数_文档字符串" function_suite return [expression] 定义函数以def关键词开头,后面跟着函数名、圆括号()、括号中的参数、冒号;接着,在缩进块中编写函数体,函数的第一行语句一般是写文档字符串,用于存放函数说明,也可以选择不写;Return[expression]表示结束函数,并返回值。而不带表达式的return相当于返回空值。2._python函数的组成部分中包含( )。(多选题) a.定义函数的关键字 def b.函数体 c.re

Python实现APP自动化发微信群消息。这才是内卷的极致。_app将消息推送到微信群聊-程序员宅基地

文章浏览阅读1.6k次,点赞2次,收藏9次。但是对于很多人来说,首先编写一款 App 需要一定的移动端开发经验,其次还需要另外编写无障碍服务应用,如此显得有一定难度的本篇文章将介绍另外一种方案,即:利用前面文章介绍的 AutoJS 来实现自动给微信群发送新闻早报2. 爬虫及服务为了演示方便,这里以百度热搜为新闻早报数据源,使用 Requests + BeautifulSoup 按热度,爬取热度最高的 15 条数据importrequestsfrombs4importBeautifulSoupdefbaidu_to..._app将消息推送到微信群聊