Application和Activity,Service一样是android框架的一个系统组件,

当android程序启动时系统会创建一个application对象,用来存储系统的一些信息。

通常我们是不需要指定一个Application的,这时系统会自动帮我们创建。

打开每一个应用程序的manifest文件,可以看到activity都是包含在application标签之中,如下:

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@android:style/Theme.DeviceDefault.Light.NoActionBar" >
<activity
android:name="com.example.winxinmff.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

AndroidManifest.xml

android系统会为每个程序运行时创建一个Application类的对象且仅创建一个,所以Application是单例 (singleton)模式的一个类.

且application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。

因为它是全局的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象。

因此在安卓中我们可以避免使用静态变量来存储长久保存的值,而用Application。

为了更好的利用Application的这一特性,比如我们需要Application来保存一些静态值,需要自定义继承于Application的类,

然后在这个类中定义一个变量来保存。在默认情况下应用系统会自动生成Application 对象,

但是如果我们自定义了Application,那就需要告知系统,实例化的时候,是实例化我们自定义的,而非默认的。

比如我们自定义了一个GlobalApplication类:

package com.example.winxinmff;

import android.app.Application;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log; public class GlobalApplication extends Application { // 公共的 写在这里 private String tag = "application";
private DatabaseHelper db_helper; public void onCreate() {
Log.i(tag, "onCreate执行了"); // 此3行代码用于创建表结构,以及初始化数据
MyDatabaseOpenHelper helper = new MyDatabaseOpenHelper(this);
SQLiteDatabase db = helper.getWritableDatabase();
db.close(); // db_helper = new DatabaseHelper(this); super.onCreate();
} public void onTerminate() {
Log.i(tag, "onTerminate 执行了,程序真的over");
super.onTerminate();
} public void onLowMemory() {
Log.i(tag, "onLowMemory 执行了,警告,有想杀你的冲动,但没杀...");
super.onLowMemory();
} public void onTrimMemory(int level) {
db_helper.close();
db_helper = null; Log.i(tag, "onTerminate 执行了,基本上会在activit休眠的时候执行");
super.onTrimMemory(level);
} public DatabaseHelper getDb_helper() {
if (db_helper == null) {
db_helper = new DatabaseHelper(this);
}
return db_helper;
} }

GlobalApplication.java

为了让系统实例化的时候找到,我们必须在manifest(清单文件)中修改application标签属性:

 <application
android:name="com.example.winxinmff.GlobalApplication"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@android:style/Theme.DeviceDefault.Light.NoActionBar" >
<activity
android:name="com.example.winxinmff.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

AndroidManifest.xml

关键的是这句:

通常Application全局对象是通过Context或者Activity的getApplicationContext()方法

获得的比如我们在应用程序中想要获得我们刚刚定义的GlobalApplication 对象,就需要在activity中这样做:

  app = (GlobalApplication) this.getApplication();

如果有Context对象,还可以:app = (GlobalApplication)mContext.getApplicationContext();

但是很多时候我们的代码可能在activity之外,且没有context对象的引用,但是又需要获得GlobalApplication对象,

原始的做法可能是想办法将activity或者context传递到需要调用的地方,但是这样代码耦合度太高,可读性差。我们有更优雅的做法。

我们谈到Application对象是全局的,单例的,既然是单例应该有一个类方法能让我们获得这个单例对象才是,但Application本身没有,我们只能在自定义的时候想办法。

Application是系统的一个组件,也就有自己的生命周期函数,

让人感到意外的是他的生命周期函数中居然也有onCreate(),onCreate是被自动调用的,我们可以利用这点来获得这个Application对象。

在GlobalApplication中加入如下几行代码:

数据库助手的get方法

这样我们就能在app工程的任何地方通过GlobalApplication.getDb_helper()来获得Application全局对象。比如我定义了一个工具类,在工具内中我们需要使用

Context的getExternalFilesDir()方法。但是这个工具类没有直接的办法获取到context,于是我们可以:

package com.example.winxinmff;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast; import com.example.entity.Message;
import com.example.winxinmffSQL.R;
import com.j256.ormlite.dao.Dao; public class MainActivity extends Activity { private SimpleAdapter sa; // 是android中一个列表适配器 主要用于做一些简单的列表适配
private ListView lv;
private List<Message> messageList = new ArrayList<Message>();
private List<Map<String, Object>> messageList2 = new ArrayList<Map<String, Object>>();
private List<Message> messageList3 ; // 用于ORMLite
// 看名字就是databasehelper,数据库助手的意思,这本身就是一个类。
// 包含了数据库连接,关闭,如果有拓展的话 可能包含基本的数据库JDBC操作方法也就是简化增删改查的一些方法。
// private DatabaseHelper db_helper; // 其他
private GlobalApplication app = null; // 自己建的类 // 没有前生
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.weixin); app = (GlobalApplication) this.getApplication();
Log.i("ok", "onCreate 执行了"); lv = (ListView) findViewById(R.id.listView1);
sa = new SimpleAdapter(this,
messageList2, // data 不仅仅是数据,而是一个与界面耦合的数据混合体
R.layout.listview_item_layout,
new String[] { "tou", "userName", "lasMessage", "datetime" }, // from 从哪来
new int[] { R.id.imageView1, R.id.tv_userName, R.id.tv_lasMessage, R.id.tv_datetime }// to 到哪去
); lv.setAdapter(sa);
lv.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Map<String, Object> item = messageList2.get(position);
item.put("userName", "阿凡达" + position);
sa.notifyDataSetChanged(); // Toast.makeText(MainActivity.this, (String)item.get("userName"), Toast.LENGTH_SHORT).show();
}
}); // 简单理解为VC绑在一起 } // UI呈现在眼前
protected void onResume() {
Log.i("ok", "onResume,界面出现了,app"+app); // 使用 ORMLite // db_helper = new DatabaseHelper(this); Dao<Message, Integer> message_dao = app.getDb_helper().getMessageDao();
try {
messageList3 = message_dao.queryForAll();
// Log.i("ormlite", "记录条数:"+messageList3.size());
String t = "记录条数:" + messageList3.size();
Toast.makeText(this, t, Toast.LENGTH_LONG).show(); } catch (SQLException e) {
String t = "记出错:" + e.getMessage();
Toast.makeText(this, t, Toast.LENGTH_LONG).show();
} // 模拟读取数据库或者互联网
for (int i = 0; i < messageList3.size(); i++) {
Message p = new Message();
p.setTou1("xxx");
p.setUserName("不对外开放 高内聚 ");
p.setLastMessage("匿名内部类也就是没有名字的内部类匿名内部类也就是没有名字的内部类");
p.setDatetime("11.11");
messageList.add(p);// 上周 // 定义一个界面与数据的混合体,一个item代表一行记录
Map<String, Object> item = new HashMap<String, Object>();
// 一行记录,包含多个控件
item.put("tou", R.drawable.a);
item.put("userName", messageList3.get(i).getUserName() + i);
item.put("lasMessage", messageList3.get(i).getLastMessage());
item.put("datetime", messageList3.get(i).getDatetime());
messageList2.add(item);
} super.onResume();
} // UI完全显示在眼前,完全被另一个进程覆盖
protected void onPause() {
Log.i("ok", "onPause,被抛弃了");
app.getDb_helper().close();// ??到底要不要?
super.onPause();
} }

MainActivity.java

现在就可以多次使用数据库助手了

Android 数据库读取数据显示优化 Application [6]的更多相关文章

  1. Android 数据库读取数据显示 [5]

    2016-12-1 课程内容 昨天学了Android数据库升级.降级.创建 今天把数据库表里面的数据读取出来显示到手机屏幕上 下面代码是MainActivity.java 的代码 package co ...

  2. 初学coreData数据库读取不成功的问题

    写了一个从数据库读取数据显示列表的代码,结果却无法运行,提示找不到对应的entity,也就是数据库中的某一个表 我查遍了代码也没有发现什么逻辑错误,在appDelegate也初始化了相关数据库,在界面 ...

  3. Android数据读取之Sqlite数据库操作

    咱们书接上文,继续来说说Android数据读取,这回,我们要讲的是Sqlite数据库的相关操作.以一个实例开始吧: 首先,上图,看看做成后的效果: 大概描述:类似于浏览器的收藏夹,网站名称,网站地址, ...

  4. Android打开数据库读取数据

    打开数据库读取数据 private MyDatabaseHelper dbHelper; dbHelper=new MyDatabaseHelper(this,"List.db", ...

  5. 【Android Api 翻译3】android api 完整翻译之Application Fundamentals (学习android必须知道的)

    Android应用程序是用Java编程语言编写的.Android SDK工具把应用程序的代码.数据和资源文件一起编译到一个Android程序包中(这个程序包是以.apk为后缀的归档文件),一个Andr ...

  6. 转——Android应用开发性能优化完全分析

    [工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.] 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉 ...

  7. Android 应用开发性能优化完全分析

    1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...

  8. 【转】Android应用开发性能优化完全分析

    http://blog.csdn.net/yanbober/article/details/48394201 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关 ...

  9. 关于android应用--内存的优化

    以下内容为转载自网上,然后自己加工贴合到一块的: 原文地址:http://www.cnblogs.com/frydsh/archive/2012/12/09/2810601.html http://w ...

随机推荐

  1. Jenkins 二:邮件配置

    默认邮件的配置 假设管理员邮箱是 user1@domain1.com,密码是pw1. 1. 打开“系统管理”-> “系统设置”. 2. 找到“Jenkins Location”-> “系统 ...

  2. Teacher YYF - POJ 3746(打表........)

    1.名词和介词可以被用作主语或宾语 名词->n  介词->pron 2.当使用名词时,必须有冠词在它前面 n+art(冠词) 3.名词可以被一个形容词修饰,动词可以被一个副词修饰 adj+ ...

  3. Http报文 状态码

    一.HTTP报文 1.HTTP报文介绍 HTTP报文:用于HTTP协议交互的信息. HTTP报文由报文头部和报文主体(非必须)构成,中间由空行来分隔. 1.1 请求报文:客户端发起的报文. 1).报文 ...

  4. dubbo源码分析一:整体分析

    本文作为dubbo源码分析的第一章,先从总体上来分析一下dubbo的代码架构.功能及优缺点,注意,本文只分析说明开源版本提供的代码及功能. 1.dubbo的代码架构:  spring适配层:常规的sp ...

  5. 第三篇:数据仓库系统的实现与使用(含OLAP重点讲解)

    前言 上一篇重点讲解了数据仓库建模,它是数据仓库开发中最核心的部分.然而完整的数据仓库系统还会涉及其他一些组件的开发,其中最主要的是ETL工程,在线分析处理工具(OLAP)和商务智能(BI)应用等. ...

  6. 解密-神秘的 RunLoop

    引言 一直以来RunLoop就是个神秘的领域,好多2.3年的开发者都不能准确的表述它的作用,说它神秘,其实RunLoop并没有大家想象中的那么神秘,那么不好理解,本文就带大家好好剖析一下”神秘的Run ...

  7. java.lang.ClassCastException: android.view.ViewGroup$LayoutParams cannot be cast to android.widget.L(转)

    09-09 10:19:59.979: E/AndroidRuntime(2767): FATAL EXCEPTION: main09-09 10:19:59.979: E/AndroidRuntim ...

  8. Android Studio下打jar包

    在我们使用Eclipse时,我们常常使用的第三方类库文件大多都是jar包形式,用起来很方便.但是jar包只能打包class文件,对于Android UI类库而言,我们常常需要打包资源文件,对于界面不多 ...

  9. JavaScript--时间显示小插件

    JS调用系统时间,显示在当前页面上,利用DOM操作节点来实现动态刷新 <!DOCTYPE html> <html> <head> <meta charset= ...

  10. <html:form>、 <html:text>、<html:password>、<html:submit> 标签

    用Struts标签来写表单元件, 引用: <%@ taglib uri="/tags/struts-html" prefix="html" %> 例 ...