zoukankan      html  css  js  c++  java
  • android 基础概述

    废话两三句:这部分我不打算写很多,因为毕竟不是最感兴趣的,也不想将来靠它吃饭。android是大三的时候为了帮同学凑参赛作品边学边做了一点,但是赛后就基本忘干净了,刚接到个电话让我去参加一个笔试内容是android,我不得不斯巴达了,赶紧复习一下,所以说,掌握一技之长还是好的,不要临阵磨枪啊,真是悲剧。

    很多人学习android都会从activity看起,但是我当年完全不了解这个东西也还是做出来东西了,其实就是个概念性问题,就算一开始不太懂写代码的时候也会慢慢的懂了。android其实是有官方的developer guide的(地址戳这里),但是因为是英语而且说的很繁琐很细致,所以我觉得,还是自己总结一下,也给入门的同学个方便。

    我也就随大流,从activity说起了。

    既然是主要用于手机,那么显然,用户和手机互动的时候,屏幕就是交互的平台,可能会和用户交互到的页面,就是一个activity,用户正在交互的页面,就是activity running状态。当然,这不仅限于一个页面,比如有时候弹出来一个框,让你点确定什么的,那么这个窗口才是当前running的,而后面那个则处于pause状态了。

    这样的状态针对于每个页面,就会有一个生命周期,用下面的图来表示:

    (图片来自android官网的guide页面。)

    其实每个状态都能从名字上看出来到底是什么意思,所以我也就不针对没一个做解说了。

    可能会有人疑惑running和resume()的关系。其实从图上能看出来running只是一个状态,不是一个函数,当你调用了onResume(),那么这个activity就处于running的状态了。

    也可能有人猜想pause和stop的差别,这个onPause()其实就是另外有了一个窗口出现,比如弹出来一个"确定删除吗?"之类的小对话框,这个时候这个对话框并没有布满整个屏幕,后面那个半遮半掩的activity就是onPause状态。

    如果你转到另一个页面了,那么前面那个页面就stop了。

    在stop之后,这个activity是并没有被杀死的,它还可以执行onRestart()来重启。如果执行了onDestory(),这个activity就是被杀掉了,里面储存的相关数据等就全从内存中抹去了。

    关于每个activity,都是要进行声明的,也就是要告诉系统哪些页面是activity,哪些是隐藏的(比如数据库文件啊什么的都是隐藏的),关于activity的声明都在一个自动生成的文件里完成。建立一个android工程后(忘了说了,android环境的配置请上网查,教程太多了~),系统自动生成一个文件,在src目录下,叫做AndroidMainifest.xml,每制作一个页面,都一定要来这个声明一下,不然就悲剧了~

    语句就用我的一个之前的小作业举例子吧:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package
    ="com.android.jk0806"
    android:versionCode
    ="1"
    android:versionName
    ="1.0">
    <uses-sdk android:minSdkVersion="8" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
    <!-- ==============注意这里~!~!~!======================== -->
    <activity android:name=".SecretDiaryActivity"
    android:label
    ="@string/app_name">

    <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    </activity>
    <activity android:name=".ActivityDiaryEdit"/>
    <!-- ===============注意这里~!~!~!======================== -->
    <activity android:name=".SetCode"/>
    <activity android:name=".EnterPage"/>
    <!-- 关闭应用程序的权限 -->
    <uses-permission android:name="\android.permission.RESTART_PACKAGES\" />
    </application>
    </manifest>

    这个是我的小作业里这个文件的完整内容,有一些是自动生成的,我们只注意我框起来那几行。

    前面的7行是自动生成的,表示了程序的入口,category字段表示了程序将从这里进入,也就是说,一个应用程序只能有一个activity生命为lanucher。

    关于action字段,可以说就是给这个activity定了一个名字,如果你希望别的应用程序可以调用这个activity以完成这个某些目标,就可以给它一个的action定义一个名字,怎么用稍后说明。

    我们自己建立一个普通的activity的时候不必那么麻烦,像第8行那样,写一个<activity android:name=".ActivityDiaryEdit"/>就OK了,‘.’后面是文件名。

    关于intent类:

    intent中文翻译是目的、意义,所以这个类其实是一个描述抽象的操作行为的类,我们利用这个类,来对一个activity进行一系列操作,例如startActivity等,它主要用来在两个activity之间传输数据,类似于两个activity之间的桥。

    应用一段代码来边看边学习:

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.diary_list);
    mDbHelper = new DiaryDbAdapter(this);
    ll=(LinearLayout)findViewById(R.id.bg);
    mDbHelper.open();
    // code=(EditText)
    //取回所有库中的日记显示
    // if(currentbg)

    if(mDbHelper.isCode()){
    Intent i = new Intent(this, EnterPage.class);
    startActivityForResult(i, ACTIVITY_ENTER);
    }
           ........     
    }

    这段就是上面的mainifest文件里提到的SecretDiaryActivity.java文件。由于声明了这个文件是入口文件,所以app已启动,想找到这个文件,接着就要找到onCreate()函数。

    可以看到if语句里就用到了intent类。这个if语句的作用是判断这个app是否加密,如果加密了,就先打开输入密码的页面,也就是EnterPage.java文件。
    而打开这个页面,就要借助intent类的实例,然后调用startActivityForResult这个函数,由于我们要保持这个activity不死,所以我们这里要用到的函数带了ForResult,而不是单纯的startActivity,这些都是根据需求选择就好。

    之所以要提这个类,就是为了解决刚才的遗留问题,mainefest文件中,有的activity里有intent-filter字段,这样的话就是说这个activity是可以被外部调用的,当我们需要调用一个外部的activity来完成某些功能的时候,就要用这样的语句:

    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);
    startActivity(intent);
    //copied from android developer guide page.


    intent这架小桥除了连接activity之外,还可以用来传输数据,比如page1要给page2传输一些数据,那么page1的内容如下:

    Intent i = new Intent(this,page2.class);
    i.putExtra(DiaryDbAdapter.KEY_ROWID, id);
    i.putExtra("current_bg", currentbg);
    i.putExtra(DiaryDbAdapter.KEY_TITLE, c.getString(c
    .getColumnIndexOrThrow(DiaryDbAdapter.KEY_TITLE)));
    i.putExtra(DiaryDbAdapter.KEY_BODY, c.getString(c
    .getColumnIndexOrThrow(DiaryDbAdapter.KEY_BODY)));
    startActivityForResult(i, 2);

    这里用putExtra来给intent实例一些数据,并且给他们明了名字,这样,在page2中读取这些数值时,就可以根据名字调取数据了:

    Bundle extras = getIntent().getExtras();
    if (extras != null) {
    String title = extras.getString(DiaryDbAdapter.KEY_TITLE);
    String body = extras.getString(DiaryDbAdapter.KEY_BODY);
    mRowId = extras.getLong(DiaryDbAdapter.KEY_ROWID);

    if (title != null) {
    mTitleText.setText(title);
    }
    if (body != null) {
    mBodyText.setText(body);
    }
    }

    用bundle类来读取到extra里携带的数据,就是这么简单,跟jsp中的数据传输好像是类似的。

    最后,说一下保存activity的状态
    简单来说,就是保存了关闭这个activity时的样子,下次打开的时候的状态跟关闭前是一样的。onSaveInstanceState (Bundle outState);

    系统才activity被毁灭的时候会留下一个intanvestate,这样可以保存一些重要的数据,关于save activity state官方也给了图形示意:

    当然,一般我们自己是不需要去重载这个函数的,就知道有这么个机制就可以了。

    注意,这个函数的调用时在onStop或者onPause之前,如果用户操作使得程序调用onStop而关闭,那么就存不下什么东西了。

    好,大体的东西先复习到这里,明天有时间的话就复习下UI设计管理,还有个性图标的制作,这个可就是我的拿手戏了~ヘ( ̄▽ ̄ヘ)

  • 相关阅读:
    Android生成自定义二维码
    Android快速实现二维码扫描--Zbar
    设计模式-桥接模式
    设计模式-组合模式
    设计模式-享元模式
    设计模式-适配器模式
    设计模式-装饰者模式
    设计模式-门面(外观)模式
    设计模式-原型模式
    设计模式-单例模式
  • 原文地址:https://www.cnblogs.com/jiaozihardworking/p/2348189.html
Copyright © 2011-2022 走看看