Context转Activity

Activity  dialogActuvitys = (Activity)context();
Activity  dialogActuvitys = (Activity)dialog.getContext();

第二种会产生异常

java.lang.ClassCastException: android.view.ContextThemeWrapper cannot be cast to android.app.Activity

解决方法:

private static Activity scanForActivity(Context cont) {  
    if (cont == null)  
        return null;  
    else if (cont instanceof Activity)  
        return (Activity)cont;  
    else if (cont instanceof ContextWrapper)  
        return scanForActivity(((ContextWrapper)cont).getBaseContext());  
  
    return null;  
}

 同时,dialog崩溃原因可查看 https://www.jianshu.com/p/4c5fafe08fa7

### 将 Context 换为 Activity 的方法 在 Android 中,`Context` 是一个接口,而 `Activity` 类实现了这个接口。因此,并非所有的 `Context` 对象都可以直接换为 `Activity` 对象。为了安全地将 `Context` 换为 `Activity`,可以采用以下几种常见方法: #### 1. 使用类型断言 如果已知传入的 `Context` 实际上是一个 `Activity`,则可以直接将其强制换为 `Activity` 类型。但是需要注意的是,这种做法存在潜在风险,因为并非所有上下文都是活动实例。 ```kotlin val activity = context as? Activity ?: throw IllegalArgumentException("The provided context is not an instance of Activity.") ``` 这种方法简单明了,但在不确定的情况下容易抛出异常[^1]。 #### 2. 判断 Context 是否为 Activity 为了避免因错误假设而导致程序崩溃,可以在尝试换之前先验证给定的对象是否确实是某个特定类型的子类或实现体成员变量。 ```java public static Activity getActivityFromContext(Context context){ if (context instanceof Activity){ return ((Activity) context); }else{ // 可能需要进一步查找父级直到找到最近的一个activity为止 while (!(context instanceof Activity)){ if (context instanceof ContextWrapper){ context=((ContextWrapper)context).getBaseContext(); }else{ break; } } if (context instanceof Activity){ return((Activity)context); }else{ throw new IllegalStateException("Unable to retrieve current Activity from given Context."); } } } ``` 这段代码片段展示了如何遍历嵌套结构直至定位到关联的Activity实体[^2]。 #### 3. 在 Base Class 中保存 Reference 另一种更为优雅且健壮的设计模式是在项目的基础活动中保留对自身的引用关系链路以便随时访问最新的顶层可见窗口单元。 ```java public abstract class BaseActivity extends AppCompatActivity { private static WeakReference<BaseActivity> sCurrentActivity; @Override protected void onStart() { super.onStart(); sCurrentActivity=new WeakReference<>(this); } @Override protected void onStop() { super.onStop(); if (!isChangingConfigurations()){ sCurrentActivity.clear(); } } public static BaseActivity getCurrentActivity(){ return sCurrentActivity!=null ? sCurrentActivity.get():null ; } } ``` 这样做的好处在于无论何时何处都能轻松获取当前正在显示于屏幕上的那个唯一有效的Activity句柄而不必担心内存泄漏等问题发生[^3]。 --- 综上所述,虽然理论上任何地方只要拿到合适的参数就可以发起跳请求,但实际上考虑到用户体验流畅度等因素限制下还是建议尽量减少跨层次调用频率从而降低复杂程度提升稳定性表现效果最佳。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值