IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android Context使用详解 -> 正文阅读

[移动开发]Android Context使用详解

一.Context概述

1.Context是一个抽象类,其通用实现在ContextImpl类中。它的主要作用是一个访问application环境全局信息的接口,包括为Activities, Fragments, and Services提供访问resource files, images, themes/styles等相关的类,其具体结构类图如下:

二.Context使用

1.启动Activity

1).java方式

Intent intent = new Intent(context, MyActivity.class);
startActivity(intent);

2).kotlin方式

val intent = Intent(context, MyActivity::class.java)
startActivity(intent)

2.创建View,

1).java方式

TextView textView = new TextView(context);

2).kotlin方式

val textView = TextView(context)

此外Contexts也包含view需要的一些信息,eg:

1‘. 将dp、sp 转换为像素的设备屏幕尺寸和维度
2'. styled属性
3'. activity onclick关联的属性

3.Inflating一个XML布局文件

1).java方式

LayoutInflater inflater = LayoutInflater.from(context);
inflater.inflate(R.layout.my_layout, parent);

2).kotlin方式

val inflater = LayoutInflater.from(context)
inflater.inflate(R.layout.my_layout, parent)

4.发送广播

1).java方式

Intent broadcastIntent = new Intent("action");
LocalBroadcastManager.getInstance(context).sendBroadcast(broadcastIntent);

2).kotlin方式

val broadcastIntent = Intent("action")
LocalBroadcastManager.getInstance(context).sendBroadcast(broadcastIntent)

5.获取系统Service,eg:发送通知,通知管理获取

1).java方式

NotificationManager notificationManager = 
    (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

int notificationId = 1;

// Context is required to construct RemoteViews
Notification.Builder builder = 
    new Notification.Builder(context).setContentTitle("title");

notificationManager.notify(notificationId, builder.build());

2).kotlin方式

val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

val notificationId = 1

// Context is required to construct RemoteViews
val builder = Notification.Builder(context).setContentTitle("title")

notificationManager.notify(notificationId, builder.build())

6.Application和Activity Context对比

在传递Context参数的时候,如果是在Activity中,我们可以传递this(这里的this指的是Activity.this,是当前Activity的context)或者Activity.this。这个时候如果我们传入getApplicationContext(),我们会发现这样也是可以用的。可是大家有没有想过传入Activity.this和传入getApplicationContext()的区别呢?首先Activity.this和getApplicationContext()返回的不是同一个对象,一个是当前Activity的实例,一个是项目的Application的实例,这两者的生命周期是不同的,它们各自的使用场景不同,this.getApplicationContext()取的是这个应用程序的Context,它的生命周期伴随应用程序的存在而存在;而Activity.this取的是当前Activity的Context,它的生命周期则只能存活于当前Activity,这两者的生命周期是不同的。getApplicationContext() 生命周期是整个应用,当应用程序摧毁的时候,它才会摧毁;Activity.this的context是属于当前Activity的,当前Activity摧毁的时候,它才摧毁。

7.Context的应用场景

ApplicationActivityServiceContentProviderBroadcastReceiver
New a DialogNOYESNONONO
Start ActivityNO1YESNO1NO1NO1
Inflation LayoutNO2YESNO2NO2NO2
Start ServiceYESYESYESYESYES
Bind ServiceYESYESYESYESNO
Send BroadcastYESYESYESYESYES
Register BroadcastReceiverYESYESYESYESNO3
Load ResourceYESYESYESYESYES

大家注意看到有一些NO后面添加了一些数字,其实这些从能力上来说是YES,但是为什么说是NO呢?解释如下:

NO1:启动Activity在这些类中是可以的,但是需要创建一个新的task。一般情况不推荐。
NO2:在这些类中去layout inflate是合法的,但是会使用系统默认的主题样式,如果你自定义了某些样式可能不会被使用。
NO3:在receiver为null时允许,在4.2或以上的版本中,用于获取黏性广播的当前值。

8.Context的数量计算

Context个数=Activity数+Service数+1(Application)

三.Context内存泄露问题

1.单例模式导致内存泄漏

1).java demo

public class CustomManager {
    private static CustomManager sInstance;

    public static CustomManager getInstance(Context context) {
        if (sInstance == null) {

            // This class will hold a reference to the context
            // until it's unloaded. The context could be an Activity or Service.
            sInstance = new CustomManager(context);
        }

        return sInstance;
    }

    private Context mContext;

    private CustomManager(Context context) {
        mContext = context;
    }
}

2).kotlin demo

class CustomManager private constructor(private val context: Context) {
    companion object {
        @Volatile
        private var instance: CustomManager? = null

        fun getInstance(context: Context): CustomManager {
            val i = instance
            if (i != null) {
                return instance as CustomManager
            }
            return synchronized(this) {
                val i2 = instance
                if (i2 != null) {
                    i2
                } else {
                    val created = CustomManager(context)
                    instance = created
                    created
                }
            }
        }
    }
}

上面demo有内存泄露的隐患,如果是在Activity中创建这个单例的话,传入的context为Activity的context,如果想要销毁Activity,但是单例的生命周期是整个应用,导致Activity的内存不能完全释放,

正确的方法是将application context存储在CustomManager.getInstance()中。 application context是一个单例,并且与应用程序进程的生命周期相关联,因此可以安全地存储对它的引用。

如果在组件的生命周期之外需要Context引用,或者它应该独立于传入的Context的生命周期,请使用application context。eg:

1).java方式

public static CustomManager getInstance(Context context) {
    if (sInstance == null) {

        sInstance = new CustomManager(context.getApplicationContext());
    }

    return sInstance;
}

2).kotlin方式

class CustomManager private constructor(private val context: Context) {
    companion object {
        fun getInstance(context: Context): CustomManager {

            val created = CustomManager(context.applicationContext)
        }
    }
}

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-11 22:21:45  更:2022-03-11 22:22:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 19:10:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码