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设计管理,还有个性图标的制作,这个可就是我的拿手戏了~ヘ( ̄▽ ̄ヘ)

  • 相关阅读:
    Ubuntu adb devices :???????????? no permissions (verify udev rules) 解决方法
    ubuntu 关闭显示器的命令
    ubuntu android studio kvm
    ubuntu 14.04版本更改文件夹背景色为草绿色
    ubuntu 创建桌面快捷方式
    Ubuntu 如何更改用户密码
    ubuntu 14.04 返回到经典桌面方法
    ubuntu 信使(iptux) 创建桌面快捷方式
    Eclipse failed to get the required ADT version number from the sdk
    Eclipse '<>' operator is not allowed for source level below 1.7
  • 原文地址:https://www.cnblogs.com/jiaozihardworking/p/2348189.html
Copyright © 2011-2022 走看看