`
ithinkfeed
  • 浏览: 93318 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android-传递数据的一些讨论

阅读更多

在Android中编写过程序的开发人员都知道。在Activity、Service等组件之间传递数据(尤其是复杂类型的数据)很不方便。一般可以使用Intent来传递可序列化或简单类型的数据。看下面的代码。

Intent intent = new Intent(this, Test.class);
     intent.putExtra("param1", "data1");
     intent.putExtra("intParam1", 20);
     startActivity(intent);
这样就ok了。在当前Activity将两个值传到了Test中。但如果遇到不可序列化的数据,如Bitmap、InputStream等,intent就无能为力了。因此,我们很自然地会想到另外一种方法,静态变量。如下面的代码所示:

public class Product extends Activity
   {
        public static Bitmap mBitmap;
 
   }
 

对于上面的代码来说,其他任何类可以直接使用Product中的mBitmap变量。这么做很easy、也很cool,但却very very wrong。我们千万不要以为Davlik虚拟机的垃圾回收器会帮助我们回收不需要的内存垃圾。事实上,回收器并不可靠,尤其是手机上,是更加的不可靠。 因此,除非我们要使自己的程序变得越来越糟糕,否则尽量远离static。

注:如果经常使用static的BitmapDrawable等变量。可能就会抛出一个在Android系统中非常著名的异常(以前budget这个单词一直记不住什么意思,自从经常抛出这个异常后,这个单词终于烂熟于心了,)

ERROR/AndroidRuntime(4958): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget

如果不使用static,总得有方法来代替它(尽管我很喜欢public static,我相信很多人也喜欢它,但为了我们的程序,建议还是忍痛割爱吧),那么这个新的解决方案就是本文的主题,这就是Application Context,相当于Web程序的Application,它的生命周期和应用程序一样长(这个我喜欢)。

那么现在来看看如何使用这个Application Context。我们可以通过Context.getApplicationContext或Context.getApplication方法获得 Application Context。但要注意,我们获得的只是Context对象,而更理想的方法是获得一个类的对象。ok,说干就干,下面来定义一个类。

package net.blogjava.mobile1;
 
import android.app.Application;
import android.graphics.Bitmap;
 
public class MyApp extends Application
{
    private Bitmap mBitmap;
 
    public Bitmap getBitmap()
    {
        return mBitmap;
    }
 
    public void setBitmap(Bitmap bitmap)
    {
        this.mBitmap = bitmap;
    }
 
}

上面这个类和普通的类没什么本质的不同。但该类是Application的子类。对了,这就是使用Application Context的第一步,定义一个继承自Application的类。然后呢,就在这个类中定义任何我们想使其全局存在的变量了,如本例中的 Bitmap。下面还需要一个重要的步骤,就是在标签中使用android:name属性来指定这个类,代码如 下:

<application android:name=".MyApp" android:icon="@drawable/icon" android:label="@string/app_name"></application>

接下来的最后一步就是向MyApp对象中存入Bitmap对象,或从MyApp对象中取出Bitmap对象了,存入Bitmap对象的代码如下:

MyApp myApp = (MyApp)getApplication();
 
    Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.icon);
 
    myApp.setBitmap(bitmap);

获得Bitmap对象的代码:

ImageView imageview = (ImageView)findViewById(R.id.ivImageView);
 
    MyApp myApp = (MyApp)getApplication();
 
    imageview.setImageBitmap(myApp.getBitmap());
 

上面两段代码可以在任何的Service、Activity中使用。全局的。

原作者:李宁

原文链接:http://www.cnblogs.com/nokiaguy/archive/2010/11/10/1873251.html  

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    android-GridView-事件-Intent-传递参数1.rar

    4. **Intent传递参数**: 在Android中,Intent用于启动Activity或者Service,也可以用来在不同组件间传递数据。当用户点击GridView中的某一项,我们可能希望启动一个新的Activity来显示更详细的信息。此时,可以在`...

    android----intent

    Intent不仅能够传递数据,还能在应用的不同部分之间建立连接,是Android开发中的核心概念之一。 标题"android----intent"暗示了我们将深入探讨Android中的Intent系统。Intent主要有两种类型:显式Intent和隐式...

    Android-展示Android的单向数据流架构由KotlinCoroutines提供支持

    这种架构的核心理念是数据只能沿着一个方向流动,即从模型到视图,而不能反向传递。在这个场景中,我们讨论的是如何使用Kotlin Coroutines来增强这一流程,使得异步操作变得更加简洁高效。 Kotlin Coroutines是...

    android-share-menu

    1. **Intent**:Intent是Android中的一种消息对象,用于启动新的Activity或Service,或者传递数据。在分享菜单中,Intent携带了要分享的内容和目标应用的信息。 2. **ACTION_SEND Intent**:要启动分享菜单,开发者...

    《深入浅出Android-Google手持设备应用程序设计.pdf》高清下载

    例如,如何重构代码以提高应用程序的质量和可维护性,如何在应用中加入对话框和菜单,以及如何使用Intent来在应用的不同部分之间传递数据。除此之外,还介绍了如何定义Android清单文件,如何添加新的Activity,并且...

    Android代码-android-note

    开发者通常会详细阐述这些组件的生命周期、交互方式以及如何在不同组件间传递数据。 网络通信是现代应用不可或缺的部分。Android提供了多种网络库,如HttpURLConnection、Volley、Retrofit和OkHttp。开发者可能分享...

    android-framework-hal

    - **Camera和Overlay的结合**:通过HAL层,可以将摄像头的数据直接传递给Overlay系统进行显示。 ### Android的多媒体系统 #### 9.1 多媒体系统的结构 - **应用到底层的层次结构**:多媒体系统同样遵循多层架构的...

    zxing-android-embedded,ZXing Android应用程序的端口,作为Android库项目,用于嵌入Android应用程序。.zip

    5. **结果回调**:扫描成功后,ZXing-android-embedded会通过回调机制将解码结果传递给应用程序,以便进一步处理。 6. **易于集成**:只需简单的几行代码,开发者就可以将扫描功能集成到他们的Android项目中,大大...

    sample-android-app,Android应用程序示例.zip

    8. **Intent**: Intent用于在Android组件之间通信,比如启动一个Activity或服务,传递数据等。在代码中,Intent对象的创建和使用是很常见的。 9. **Adapter与ListView/RecyclerView**: 当需要展示大量数据时,通常...

    Android-From-Screen-To-Screen-Acticity-Example.

    Intent是一个意图对象,用来表达应用想要执行的操作或者传递数据。在两个Activity间进行跳转时,通常会创建一个Intent,并指定目标Activity的类名。例如: ```java Intent intent = new Intent(this, ...

    Android-实现UniqueAdapter与数据绑定

    3. **Adapter的构造函数**:创建Adapter时,你需要传递数据源(如ArrayList)以及上下文(Context)作为参数。这样,Adapter就能知道在哪里创建视图,并如何获取数据。 4. **getView()方法**:这是Adapter的核心...

    android-sdk-assets

    标题"android-sdk-assets"暗示我们将讨论的是使用SDK来处理`assets`文件。在Android SDK中,`AssetManager`是核心组件,它提供了访问`assets`目录内文件的方法。以下是一些关键知识点: 1. **AssetManager**: 这是...

    深入浅出Android--Google手持设备应用程序设计

    最后,书中会涵盖一些高级话题,如Android的通知系统、BroadcastReceiver、Service以及如何进行单元测试和兼容性测试,这些都是构建高质量应用所必需的知识。 总的来说,《深入浅出Android--Google手持设备应用程序...

    Android Intent传递对象

    在Android应用开发中,Intent是一种强大的工具,用于在不同的组件之间进行通信,如启动Activity、启动Service或在组件间传递数据。"Android Intent传递对象"这个主题主要关注如何利用Intent来传递自定义对象,以便在...

    Android-基于AndroidThingsHyperLPR实现的车牌检测识别

    接下来,我们讨论HyperLPR4Android库。这个库是基于开源的超快速车牌识别算法——HyperLPR,它能快速准确地识别出车辆的车牌号码。HyperLPR4Android将该算法移植到了Android平台,使得开发者可以在Android设备上实现...

    android-contact.rar_Android 小应用_android contact_contact

    Intent用于在Activity间传递数据和启动服务。 7. **Adapter与ListView/RecyclerView**: - 为了展示联系人列表,应用通常会使用Adapter将数据绑定到ListView或RecyclerView控件上,使数据集能在界面上动态显示。 ...

    Android-Project-demo1.zip

    5. **Activity之间的数据传递**: 通过Intent,我们不仅可以启动Activity,还能传递数据。可以使用`putExtra()`方法将数据(如字符串、整数等)附加到Intent,然后在目标Activity中用`getExtras()`获取这些数据。 6....

    jpush-android-4.9.0-google-play

    针对Android平台,JPush提供了专门的SDK,即我们这里讨论的"jpush-android-4.9.0-google-play"版本。此版本是专为在Google Play上发布的应用设计的,考虑了谷歌平台的特性和政策。 一、JPush SDK核心功能 1. **...

    Android-Android运行时组件化方案

    "Android-Android运行时组件化方案"着重讨论了如何在Android应用中实现组件之间的独立性和通信。下面将详细阐述这个方案的关键点。 首先,组件化的核心思想是将一个大型的、复杂的Android应用拆分成多个小型的、...

Global site tag (gtag.js) - Google Analytics