精华内容
下载资源
问答
  • 在学习Android的时候一直未context的问题觉得头疼,因为想做一些工具类,但是又不是四大组件,总要来回传递context,觉得很麻烦,就想全局获取,最后看到application是全局单例的,所以改造一下。首先需要重写...

    在学习Android的时候一直未context的问题觉得头疼,因为想做一些工具类,但是又不是四大组件,总要来回传递context,觉得很麻烦,就想全局获取,最后看到application是全局单例的,所以改造一下。

    首先需要重写Application,主要重写里面的onCreate方法,就是创建的时候,初始化一个Map,这样就可以插入任意值。然后在整个应用中的各个文件中就可以对该变量进行操作了。

    在程序中有两种获得方式getInstance() 和 在四大组件中通过 getApplication() 分别获得app

    package com.xin.app;

    import java.util.HashMap;

    import java.util.Map;

    import android.app.Application;

    import android.util.Log;

    /**

    *

    * @author silence鼬

    * @url http://write.blog.csdn.net/mdeditor#!postId=46674445

    * @tip 欢迎转载

    *

    */

    public class App extends Application {

    private static App instance;

    private Map innerMap = new HashMap();

    @Override

    public void onCreate() {

    super.onCreate();

    instance = this;//注意这里,不是常用的单例方式

    }

    public static App getInstance(){

    Log.v("app", "getInstance instance "+instance.toString());

    return instance;

    }

    public void addParam(Object key,Object value){

    innerMap.put(key, value);

    }

    public Object getParam(Object key){

    return innerMap.get(key);

    }

    }

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    上面代码添加了一个内部Map,和对应的访问方法,全局使用getApplication() 和App.getInstance()都可使用

    ————————————————

    版权声明:本文为CSDN博主「香菜聊游戏」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

    原文链接:https://blog.csdn.net/perfect2011/article/details/46674445

    展开全文
  • Android开发中,Service或Activity之间的通信会涉及到变量的传递和保存,以下是保存变量几种方法:1、继承Application类如果想在整个应用中使用全局变量,在java中一般是使用静态变量,public类型;而在android中...

    在Android开发中,Service或Activity之间的通信会涉及到变量的传递和保存,以下是保存变量几种方法:

    1、继承Application类

    如果想在整个应用中使用全局变量,在java中一般是使用静态变量,public类型;而在android中如果使用这样的全局变量就不符合Android的框架架构,但是可以使用一种更优雅的方式就是使用Application context。

    首先需要重写Application,主要重写里面的onCreate方法,就是创建的时候,初始化变量的值。然后在整个应用中的各个文件中就可以对该变量进行操作了。

    启动Application时,系统会创建一个PID,即进程ID,所有的Activity就会在此进程上运行。那么我们在Application创建的时候初始化全局变量,同一个应用的所有Activity都可以取到这些全局变量的值,换句话说,我们在某一个Activity中改变了这些全局变量的值,那么在同一个应用的其他Activity中值就会改变。下面举个例子详细介绍一下应用步骤。

    MyApp.java

    public class MyApp extends Application{

    private String mylabel ;

    public String getLabel(){

    return mylabel;

    }

    public void setLabel(String s){

    this.mylabel = s;

    }

    @Override

    public void onCreate() {

    // TODO Auto-generated method stub

    super.onCreate();

    setLabel("Welcome!"); //初始化全局变量

    }

    }

    MainActivity.java

    public class MainActivity extends Activity {

    private MyApp myApp;

    @Override

    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    myApp = (MyApp) getApplication(); //获得自定义的应用程序MyApp

    Log.i("guoll", "InitLabel:"+myApp.getLabel());   //将我们放到进程中的全局变量拿出来,看是不是我们曾经设置的值

    }

    修改配置文件ApplicationManifest.xml,将要运行的应用程序MyApp加进去:

    package="com.android.test"

    android:versionCode="1"

    android:versionName="1.0">

    android:icon="@drawable/icon"

    android:label="@string/app_name"

    >

    android:label="@string/app_name">

    PS:非Activity好像不能用这种方法!

    2,使用Preference

    Preference(配置)提供了一种轻量级的数据存取方法,主要应用于数据比较少的配置信息。它以“key-value”(是一个Map)对的方式将数据保存在一个XML配置文件中,例如,手机的开机问候语,可以将其以Preference方式来进行配置。也可以保存一些用户个性化设置的字体、颜色、位置等参数信息。

    android.content.SharedPreferences是一个接口,用来获取和修改持久化存储的数据。有三种获取系统中保存的持久化数据的方式:

    a. public SharedPreferences getPreferences (int mode)

    通过Activity对象获取,获取的是本Activity私有的Preference,保存在系统中的xml形式的文件的名称为这个Activity的名字,因此一个Activity只能有一个,属于这个Activity。

    b. public SharedPreferences getSharedPreferences (String name, int mode)

    因为Activity继承了ContextWrapper,因此也是通过Activity对象获取,但是属于整个应用程序,可以有多个,以第一参数的name为文件名保存在系统中。

    c. public static SharedPreferences getDefaultSharedPreferences (Context context)

    PreferenceManager的静态函数,保存PreferenceActivity中的设置,属于整个应用程序,但是只有一个,Android会根据包名和PreferenceActivity的布局文件来起一个名字保存。

    通过以上方式取得SharedPreferences后就可以对数据进行读取或者保存了。

    保存方式如下:

    String STORE_NAME = "Settings";

    SharedPreferences settings = getSharedPreferences(STORE_NAME, MODE_PRIVATE);

    SharedPreferences.Editor editor = settings.edit();

    editor.putInt("sourceType", 0);

    editor.commit();

    获得SharedPreferences,如果需要进行保存等修改操作,首先得通过其edit()方法获得SharedPreferences.Editor,然后就可以通过putInt、putString等方法以键值对(key-value)的方式保存数据,或者remove移除某个键(key),及调用clear方法删除所有内容。最后需要调用commit方法是使修改生效。

    SharedPreferences settings = getSharedPreferences(STORE_NAME, MODE_PRIVATE);

    int source = settings.getInt("sorceType", 1);

    读取就更加简单了,只要获得SharedPreferences后,就可以通过getInt、getString等方法获取对应键(key)保存着的数据,如果没有找到key,则返回第二个参数作为默认值。

    3,保存在数据库

    数据库将单独介绍。

    4,保存数据到静态文件

    5,声明static 静态变量   在Android中不推荐使用。 总结:  每种方法都有各自的特点,在选择时请选择最合适的方法。文中有错误或者遗漏的地方请大家补充,谢谢!

    展开全文
  • 这是对上一篇的补充:如何合理的监听程序中一个变量的变化。有时候,我们在程序中会设定一个变量作为标志,而程序需要监听这个标志,当这个标志发生改变时,程序做出相应的处理。主要的代码解释如下:1、将变量放置...

    这是对上一篇的补充:

    如何合理的监听程序中一个变量的变化。

    有时候,我们在程序中会设定一个变量作为标志,而程序需要监听这个标志,当这个标志发生改变时,程序做出相应的处理。

    主要的代码解释如下:

    1、将变量放置在一个类中,在该类中对变量有get 、set方法,并在set方法中做回调。

    2、在这里,我们还提供一个方法供程序传入监听接口。

    3、将类的引用作为单例,便于后续设置监听位置。

    package com.example.broadcastwithobserver;

    public class Var {

    private BroadListener broadListener;

    private int var;

    private static Var varInstance;

    private Var(){

    }

    public static Var getInstance(){

    if(null==varInstance)

    {

    varInstance=new Var();

    }

    return varInstance;

    }

    public void setBroadListener(BroadListener broadListener){

    this.broadListener=broadListener;

    }

    /**

    * @return the var

    */

    public int getVar() {

    return var;

    }

    /**

    * @param var the var to set

    */

    public void setVar(int var) {

    this.var = var;

    if(null!=broadListener){

    if(var==1){

    broadListener.onSuccess();

    }

    else {

    broadListener.onFail("收到失败回复");

    }

    }

    }

    }

    使用监听方式如下:

    Var.getInstance().setBroadListener(new BroadListener() {

    @Override

    public void onSuccess() {

    // TODO Auto-generated method stub

    Toast.makeText(MainActivity.this, "监听器接收到广播了!!!", 0).show();

    }

    @Override

    public void onFail(String msg) {

    // TODO Auto-generated method stub

    Toast.makeText(MainActivity.this,msg, 0).show();

    }

    });

    当我们做如下操作时,监听就起效,做出回调了:

    Var.getInstance().setVar(0);

    展开全文
  • 我在09年Android相对较新的时候就写下了这个答案,并且在Android开发中有许多尚未完善的领域。 我在本文的底部添加了很长的附录,以解决一些批评,并详细说明了我对使用Singleton而不是将Application子类化的观点上...

    我在09年Android相对较新的时候就写下了这个答案,并且在Android开发中有许多尚未完善的领域。 我在本文的底部添加了很长的附录,以解决一些批评,并详细说明了我对使用Singleton而不是将Application子类化的观点上的分歧。 阅读它需要您自担风险。

    原始答案:

    您遇到的更普遍的问题是如何在多个“活动”和应用程序的所有部分中保存状态。 静态变量(例如,单例)是实现此目的的常见Java方法。 但是,我发现,Android中一种更优雅的方法是将您的状态与Application上下文相关联。

    如您所知,每个Activity也是一个Context,它是广义上有关其执行环境的信息。 您的应用程序还具有上下文,Android保证它在您的应用程序中作为单个实例存在。

    这样做的方法是创建自己的android.app.Application子类,然后在清单的application标记中指定该类。 现在,Android将自动创建该类的实例,并使它可用于整个应用程序。 您可以使用Context.getApplicationContext()方法从任何context访问它( Activity还提供了具有完全相同效果的getApplication()方法)。 以下是一个极为简化的示例,但要注意以下几点:

    class MyApp extends Application { private String myState; public String getState(){ return myState; } public void setState(String s){ myState = s; } } class Blah extends Activity { @Override public void onCreate(Bundle b){ … MyApp appState = ((MyApp)getApplicationContext()); String state = appState.getState(); … } }

    本质上与使用静态变量或单例具有相同的效果,但是可以很好地集成到现有的Android框架中。 请注意,这将无法跨进程使用(如果您的应用程序是具有多个进程的稀有应用程序之一)。

    上面的示例中有一些注意事项; 假设我们做了类似的事情:

    class MyApp extends Application { private String myState = /* complicated and slow initialization */; public String getState(){ return myState; } }

    现在,每次实例化应用程序时,都会执行这种缓慢的初始化(例如,击中磁盘,击中网络,任何阻塞等)! 您可能会认为,这只是该过程的一次,无论如何我都必须支付费用,对吗? 例如,正如黛安·哈克伯恩(Dianne Hackborn)在下文中提到的那样,完全有可能实例化您的过程(仅)以处理后台广播事件。 如果您的广播处理不需要这种状态,则可能只是无所事事地完成了一系列复杂而缓慢的操作。 延迟实例化是这里的游戏名称。 以下是使用应用程序的稍微复杂的方法,除了最简单的使用方法之外,其他方法都更有意义:

    class MyApp extends Application { private MyStateManager myStateManager = new MyStateManager(); public MyStateManager getStateManager(){ return myStateManager ; } } class MyStateManager { MyStateManager() { /* this should be fast */ } String getState() { /* if necessary, perform blocking calls here */ /* make sure to deal with any multithreading/synchronicity issues */ … return state; } } class Blah extends Activity { @Override public void onCreate(Bundle b){ … MyStateManager stateManager = ((MyApp)getApplicationContext()).getStateManager(); String state = stateManager.getState(); … } }

    虽然我更喜欢Application子类,而不是在这里使用单例作为更优雅的解决方案,但我宁愿开发人员在确实需要时使用Singleton,而不是完全不考虑将状态与Application子类相关联的性能和多线程含义。

    注意1:同样,如反咖啡厅所评论,为了正确地将应用程序替代项与应用程序绑定,清单文件中必须有一个标记。 同样,请参阅Android文档以获取更多信息。 一个例子:

    注意2: user608578在下面询问如何与管理本机对象生命周期一起工作。 我丝毫没有加快在Android上使用本机代码的速度,也没有资格回答如何与我的解决方案交互。 如果有人对此有答案,我愿意将其归功于此,并将这些信息放在此文章中,以实现最大的可视性。

    附录:

    正如某些人指出的那样,这不是 持久状态的解决方案,我也许应该在原始答案中更加强调这一点。 即,这并不意味着它是一种用于保存用户或其他信息的解决方案,这些信息或信息将在应用程序的整个生命周期中保持不变。 因此,我认为下面的大多数批评都与应用程序随时被杀死等无关,因为任何需要保留到磁盘的内容都不应通过Application子类存储。 它旨在成为一种解决方案,用于存储临时的,易于重新创建的应用程序状态(例如,是否已登录用户)和本质上是单个实例的组件(例如,应用程序网络管理器)( 不是单例!)。

    Dayerman一直很友善地指出与Reto Meier和Dianne Hackborn的有趣对话,在该对话中,不鼓励使用Application子类来支持Singleton模式。 Somatik还早些时候指出了这种性质的东西,尽管当时我没有看到。 由于Reto和Dianne在维护Android平台方面所扮演的角色,因此我不能真诚地建议您忽略他们的建议。 他们说的去。 我确实不同意关于优先选择Singleton而不是Application子类的观点。 在我不同意的情况下,我将利用在StackExchange对Singleton设计模式的解释中最好地解释的概念,以便不必在此答案中定义术语。 我强烈建议先跳过链接,然后再继续。 逐点:

    Dianne指出:“没有理由从Application进行子类化。与创建单例没有什么不同……”第一个主张是不正确的。 这有两个主要原因。 1)Application类为应用程序开发人员提供了更好的生命周期保证; 它保证了应用程序的生命周期。 单例并没有明确地依赖于应用程序的生命周期(尽管有效)。 对于您的普通应用程序开发人员而言,这可能不是问题,但是我认为这正是Android API应该提供的合同类型,并且通过最大程度地缩短关联API的使用期限,它也为Android系统提供了更大的灵活性。数据。 2)Application类为应用程序开发人员提供了状态的单个实例所有者,这与Singleton状态的所有者非常不同。 有关差异的列表,请参见上面的Singleton说明链接。

    Dianne继续说道:“ …将来很可能会后悔,因为您发现您的Application对象变成了本应是独立的应用程序逻辑的一团糟。” 这当然不是不正确的,但这不是选择Singleton而不是Application子类的原因。 Diane的论点都没有提供使用Singleton比Application子类更好的理由,她试图建立的唯一理由是使用Singleton并不比Application子类差,我认为这是错误的。

    她继续说:“这更自然地导致您应该如何管理这些事情-根据需要初始化它们。” 这忽略了以下事实:您也没有理由也无法使用Application子类按需初始化。 再次没有区别。

    Dianne的结尾是:“框架本身对于应用程序维护的所有少量共享数据都有成千上万的单例,例如已加载资源的缓存,对象池等。它运作良好。” 我不是在争论使用Singletons不能正常工作或不是合法的选择。 我在争辩说,Singletons与Android系统之间的合同不如使用Application子类提供的合同强大,而且使用Singletons通常指向不灵活的设计,这种设计不容易修改,并且会导致很多问题。 恕我直言,Android API为开发人员应用程序提供的强大合同是使用Android进行编程的最吸引人和令人愉悦的方面之一,并有助于导致早期开发人员采用,这促使Android平台取得了今天的成功。 建议使用Singletons隐含地放弃了强大的API合同,而且我认为这会削弱Android框架。

    Dianne在下面也进行了评论,并提到了使用Application子类的其他缺点,它们可能鼓励或使编写更少性能的代码更容易。 这是真的,我已经编辑了此答案,以强调此处考虑性能的重要性,如果您正在使用应用程序子类化,则应采用正确的方法。 正如Dianne所说,要记住,即使只为后台广播而加载进程,每次加载进程时也会实例化Application类(如果您的应用程序在多个进程中运行,则可能一次被实例化)。事件。 因此,重要的是将Application类更多地用作指向应用程序共享组件的指针的存储库,而不是用作进行任何处理的地方!

    我留下了以下从SingleStack链接窃取的Singletons缺点:

    无法使用抽象或接口类;

    无法分类;

    整个应用程序之间的高度耦合(难以修改);

    难以测试(在单元测试中不能伪造/模拟);

    在可变状态下很难并行化(需要广泛的锁定);

    并添加我自己的:

    不清楚且难以管理的终身合同,不适合Android(或大多数其他)开发;

    展开全文
  • Android应用程序开发中,有的时候我们在应用程序的任何一个地方都需要访问一个全局变量,也就是在任何一个Activity中都可以访问的变量。它不会因为Activity的生命周期结束而消失。要实现应用程序级的变量,我们可以...
  • 在我们使用android编写程序的时候,少不了想利用全局变量,但是面向对象语言和过程语言区别很大,不再是include就可以的。这里我写了使用全局变量的两种方法:1.使用application来保存全局变量这里没有太多理论性的...
  • Android 使用全局变量

    2021-06-06 04:02:48
    1、使用静态类:package com.Declare;public class Declare{public static String UserName="";}调用就不再过写了,直接使用类名.变量名就可以调用!...import android.app.Application;public class Declare ext...
  • a1.setClickable(false); a2.setClickable(false); a3.setClickable(false); b1.setClickable(false); b2.setClickable(false); b3.setClickable(false);...如何在Android Studio中变量发生变化时进行设置?
  • Application设置全局变量以及传值/*** 重写Application,主要重写里面的onCreate方法,就是创建的时候,* 我们让它初始化一些值,前段时间在javaeye里面看到过一个例子,与此相似,* 我做了些改进。听说外国开发者...
  • 我们在创建AVD时,在命令行窗口中输入android list targets会提示:'android'不是内部或外部命令,如图1,其实这主要是由于没有配置好Android SDK环境变量引起的。图-1 android不是内部或外部命令解决的办法有两种:...
  • 变量初始化 - Android Studio资料说:" Please also note that KontaktSDK must be initialized before first usage, but there is no mandatory to do it in Application class."程式的:import android...
  • 我们在创建AVD时,在命令行窗口中输入android list targets会提示:'android'不是内部或外部命令,如图1,其实这主要是由于没有配置好Android SDK环境变量引起的。图-1 android不是内部或外部命令解决的办法有两种:...
  • 我正在使用仅包含静态变量的类来存储所有常量和运行时属性.但是,最近我看到了引用这些变量的实例,但得到的却是null.以下是我的课程定义:public class PlayerProperties {// Runtime but constant propertiespublic ...
  • 您是否在XML文件中声明了图像的ID?如果您这样做,您可以使用以下方法:假设你的res / drawable文件夹中有picture.png.在您的活动中,您可以在main.xml文件中设置图像资源在FirstActivity中//to retrieve image using ...
  • Android全局变量

    2021-06-06 04:04:35
    慕尼黑8549860您可以使用Singleton Pattern就像这样:packagecom.ramps;publicclassMyProperties{privatestaticMyPropertiesmInstance=null;publicintsomeValueIWantToKeep;protectedMyProperties(){}publicstaticsy...
  • 新建系统变量JAVA_HOME 和CLASSPATH变量名:JAVA_HOME变量值:C:\Program Files\Java\jdk1.7.0变量名:CLASSPATH变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;3. 选择“系统变量”中变量名为“Path...
  • 所以,让我们说在我的主要活动中,我有一个像这样声明的数组,即使用任何main方法都没有任何问题:public int currentPrices[] = {0,0,0,0,0,0,0,0,...import android.app.Activity;import android.os.Bundle;import fo...
  • 原标题:Android中全局变量与局部变量的使用总结全局变量顾名思义就是在整个的类中或者可在多个函数中调用的变量。也称为外部变量。局部变量则是特定过程或函数中可以访问的变量。声明一个变量是很 容易的,但是讲到...
  • xml的内容是android:id="@+id/MainFrame"android:layout_width="match_parent"android:layout_height="match_parent" >android:id="@+id/AbsoluteLayout1"android:layout_width="match_parent"android:layout_...
  • 1.AndroidSDK路径查看(1)AndroidStudio:菜单栏AndroidStudio > Preferences > Appearences&Behavior > System Settins > Android SDK tab中的SDK Location。(2)Eclipse:菜单栏Eclipse > ...
  • 如果打开DOS窗口,输入adb显示既不是内部命令也不是外部命令,则说明没有...在系统变量下点击新建按钮,输入环境变量名Android,将android开发工具的路径导入:变量名:Android变量值:D:\prograssinstall\android\A...
  • 我正在开发一个react-native...React native:如何在ToastAndroid中打印变量值render() {return (dataSource = {this.state.dataSource}renderRow = {this._renderRow.bind(this)}renderHeader = {() => }onEnd...
  • 使用静态变量传递数据之通用方式。...首先在,mainActivity.xml文件中加入一个button按钮android:id="@+id/button"android:layout_width="match_parent"android:layout_height="wrap_content"android:text=...
  • 声明:本文转自feiyangxiaomi的...文中介绍了两种在Android中使用全局变量的方法,其中第一中是android推荐的,但是只能用于继承Activity类使用,第二种是java中设置静态变量和方法适用于所有类。1.使用applicatio...
  • 前言在Android源码的分析过程中经常会看到System.getenv(“xxx”)和getenv(“xxx”)以及Os.getenv(“xxx”)获取Android系统的环境变量值,本篇的重点不是分析代码的调用逻辑,而是讲解怎么在Android开发源码环境下...
  • Android环境变量设置

    2021-05-16 17:45:35
    windows下Android studio开发时环境变量的配置 2.环境变量配置 1)在“系统变量”新建一个变量名为JAVA_HOME的变量变量值为你本地java的安装目录,我这里为:C:\Program Files\Java\jdk1.7.0_80,设置这个的目的是...
  • 附上 stacktrace:Running com.saucelabs.appium.AndroidTestTests run: 2, Failures: 0, Errors: 2, Skipped: 0, Time elapsed: 0.722 sec <...apiDemo(com.saucelabs.appium.AndroidTest) Time ela...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 367,123
精华内容 146,849
关键字:

安卓变量