是否有一种原生的android方法来从服务获取对当前运行的Activity的引用?
我有一个在后台运行的服务,我想在事件发生时(在服务中)更新我当前的Activity.有没有一种简单的方法(就像我上面建议的那样)?
我真的不明白这整个事情是如何工作的,所以如果我有一些类A需要B扩展的类的上下文,Activity我该如何获得该上下文?
我正在寻找一种比将上下文作为类A构造函数的参数更有效的方法.例如,如果类A将有数百万个实例,那么我们最终会有数百万个冗余指针,Context而我们应该能够以某种方式只有一个地方和一个getter函数......
我正在尝试使用ActivityLifecycleCallbacks自动捕获和记录Android生命周期事件,但至少可以说这个问题的文档很少:
public void registerActivityLifecycleCallbacks (Application.ActivityLifecycleCallbacks callback)
Run Code Online (Sandbox Code Playgroud)
我不想扩展Activity类或覆盖现有的生命周期方法(onCreate,onResume等等).我希望有一个单独的类来监听这些事件并采取相应的行动.
有没有人有这方面的经验,或者链接到良好的文档或教程如何工作?具体来说,如何注册ActivityLifecycleCallbacks,以及如何处理它们?
我有一个下载一些文件的IntentService.问题是我在IntentService中创建了一个Toast
Toast.makeText(getApplicationContext(), "some message", Toast.LENGTH_SHORT).show();
Run Code Online (Sandbox Code Playgroud)
如果我退出应用程序,Toast将永远不会消失.摧毁它的唯一方法就是杀死这个过程.
我究竟做错了什么?
我有一个类需要获取它的应用程序的引用AssetManager.这个类没有扩展任何类型的android UI类,因此它没有getContext()方法或任何类似的东西.有某种静态Context.getCurrentApplicationContext()类型的方法吗?
澄清一下:我的课程旨在像图书馆一样用于其他应用程序.它没有关联AndroidManifest.xml或控制调用它的上下文.
我在应用程序清单中定义BroadcastReceiver,接收器按预期在onReceive中接收事件.但是我没有创建接收器类,因此我无法传递有关接收器应该控制的活动的任何信息.Context参数只给我应用程序上下文,没有任何活动参考.那么在应用程序活动和广播接收器之间进行通信的正确方法是什么?
我目前正在开发一个Xamarin.Forms可在Android和iOS平台上使用的应用程序.首次在设备上加载应用程序时,我会检查设备上是否有可用的Internet连接.如果互联网连接不可用,我想显示一个对话框.
以下是我用来检查互联网的以下代码片段 Xamarin.Forms.ContentPage
if(App.Connectivity.IsNetworkConnectivityAvailable())
{
App.Notification.DisplayLocalNotifications("No Internet", "You need an internet connection to access certain application content");
}
Run Code Online (Sandbox Code Playgroud)
我正在使用依赖注入来构建适当的模块来处理每个适当环境的对话框.Android正在抛出以下异常
Android.Views.WindowManagerBadTokenException:无法添加窗口 - 令牌null不适用于应用程序以下是Android上DisplayLocalNotification方法的代码:
public void DisplayLocalNotification(string title, string content)
{
AlertDialog.Builder builder = new AlertDialog.Builder(Application.Context)
.SetTitle(title)
.SetMessage(content)
.SetCancelable(true)
.SetPositiveButton("OK", (EventHandler<DialogClickEventArgs>) null);
AlertDialog alert = builder.Create();
alert.Show();
var okBtn = alert.GetButton((int)DialogButtonType.Positive);
okBtn.Click += (sender, args) =>
{
alert.Dismiss();
};
}
Run Code Online (Sandbox Code Playgroud)
在做了一些研究之后,我需要将当前活动传递给AlertDialog.Builder构造函数而不是Application.Context.当您需要活动上下文之外的活动时,如何从应用程序上下文中获取当前活动对象?
android dependency-injection xamarin.android xamarin xamarin.forms
我有一个应用程序范围的实用程序类AppUtils,我可以在任何速度发布应用程序相关信息:
例如当mesaages作为Snackbar时,我需要跟踪当前显示的View容器以使用它Snackbar.make(view, text, length);
当我想通过发布该消息时NotificationManager.notify(int, Builder);,我需要这里的Class签名
Intent resultIntent = new Intent(this, ResultActivity.class);
Run Code Online (Sandbox Code Playgroud)
因此我在我的AppUtils中:
public static void setCurrentViewAndClass(View v, Class<?> c)
{
view = v; // view is static
cls = c; // cls is static
}
Run Code Online (Sandbox Code Playgroud)
在我的项目中,我可以记住当前视图(对于Snackbar参数)和cls(对于Notification Intent).
接下来,我清除这些参数,例如当我将应用程序留在后台时:
public static void clearCurrentViewAndClass()
{
view = null;
cls = null;
}
Run Code Online (Sandbox Code Playgroud)
答:当这些参数非空时,我知道我的应用程序具有相应视图的焦点,我可以将相关消息显示为Snackbar.B.当这些参数为空时,我知道我的应用程序在后台,我想将相关消息显示为通知
因此,无论何时创建或恢复片段/活动,我setClassAndview()都会在每个片段中调用它onResume()来记住参数.
是否有更优雅的方式来跟踪当前显示的活动或活动类?
问题是,我如何获得当前的活动?已经在Stackoverflow和其他网站上被问了几十次,并且有很多提议的方法.然而,它们都具有某种形式的缺点.
在这篇文章中,我假设Android的API中没有为此提供解决方案,例如:Application.getTask().getRootActivity().
如果有:-)那不是很好吗?
所以,要清楚,我不是要求答案我如何获得当前的活动?
相反,我问的是没有提供这种能力的原因.假设每个正在运行的应用程序都有一个任务(假设任务没有被清空)并且每个这样的任务都有一个root活动,那么提供对该根Activity的访问似乎很容易.
在没有提供这种访问的情况下,当它非常明确地需要时,这对我来说意味着Android架构有一些我不理解的基础.
我错过了什么?为什么Android API不提供此信息?
作为背景,这里是一个概述已经提出的一些方法的部分.我发现以下两个链接特别有用(下面的每个方法都在一个或两个链接中提供).
链接
途径
ActivityManager
ActivityManager方法仅提供Activity类的名称,而不是当前的Activity实例.例如,对于Context实例c:
c.getSystemService().getActivityManager()
.getAppTasks().get(0).getTaskInfo()
.topActivity().getClassName()
反射
我最喜欢的是_AZ提出的反思,但这种方法很脆弱,因为它依赖于内部.我想从Android看到的是这种方法是通过标准API提供的,开发人员可以安全地依赖它.
静电钩
最常见的方法是使用静态挂钩来保存对当前运行的Activity的引用.钩子可以是按活动或按应用程序.通过保存/销毁钩子的值可以避免内存泄漏(例如,在onCreate()/ onDestroy(),onStart()/ onStop(),onPause()/ onResume()).但是,当涉及多个活动时(例如,由于生命周期重叠 - 见下文),可能会出现问题.
我实现了一个静态钩子方法,它执行以下操作(完全透明,我还没有实现#1 - 我目前正在使用per-Activity静态钩子,这是一个bug).
理论上,这将允许我始终知道任务的后台堆栈的完整状态 - 完整的活动集,包括根活动,以及它们的当前状态.然而,在实践中,有一个转折 - 当一个活动开始另一个活动时,它们的生命周期重叠.在此期间,在堆栈停止时偷看可能会产生意外的Activity实例.
来自:https://developer.android.com/guide/components/activities/activity-lifecycle.html#soafa,"协调活动":
以下是活动A启动活动B时发生的操作顺序:
- 活动A的onPause()方法执行.
- 活动B的onCreate(),onStart()和onResume()方法按顺序执行.(活动B现在具有用户关注点.)
- 然后,如果活动A在屏幕上不再可见,则执行onStop()方法
当然,这也可以管理.最重要的是,我们确实有一个可用于存储信息的全局上下文(应用程序),我们确实拥有有关活动生命周期转换的完整信息,因此我付出了足够的努力,我相信这种基于静态堆栈的方法可能会成为相当的子弹 - 证明.
不过最终
但最后我觉得我只是简单地重写代码,这些代码可能已经存在于内部,用于管理一个Activity后台堆栈,这就是为什么我要问(如果你忘记了):
为什么没有用于获取当前活动的Android API?
在这个更新中,我将总结我从这个主题以及我自己的实验和研究中学到的东西.希望这个摘要对其他人有用.
我将根据https://developer.android.com/guide/components/activities/activity-lifecycle.html上的活动状态定义,对"活动可见性状态"使用以下定义.
-----------------------------------
Visibility State Definition
----------------------------------- …Run Code Online (Sandbox Code Playgroud) 这是情况:
问题:据我搜索,无法检索前台的当前活动.
额外信息:这需要能够在多个活动中处理.因此,它可以在Activity-A或B或C中弹出.
我在开发nativescript时遇到了一些麻烦.我不知道如何在nativescript插件中获取Activity?
在android中:
import android.app.Activity;
import com.alipay.sdk.app.PayTask;
public Alipay(Activity activity) {
this.activity = activity;
PayTask alipay = new PayTask(activity);
String result = alipay.pay(payInfo);
}
Run Code Online (Sandbox Code Playgroud)
当我在nativescript中开发插件时.我写下这段代码:
var application = require("application");
var context = application.android.context;
//var context = application.android.foregroundActivity;
module.exports = {
startpay: function(orderInfo) {
var payTask = new com.alipay.sdk.app.PayTask(context);
return payTask.payV2(orderInfo,true);
}
};
Run Code Online (Sandbox Code Playgroud)
它可以使用com.alipay.sdk.app.PayTask().但背景是错误的.我试过
var context = application.android.context;
Run Code Online (Sandbox Code Playgroud)
和
var context = application.android.foregroundActivity;
Run Code Online (Sandbox Code Playgroud)
但是,当App运行时也有异常:
An uncaught Exception occurred on "main" thread. com.tns.NativeScriptException: Calling js method onClick failed
Error: …Run Code Online (Sandbox Code Playgroud) 有没有办法从应用程序上下文中获取 FragmentManager?我想使用 ImageLoader 或 BitmapFun 来存储我从服务器下载的一些位图。这两个类都需要一个 FragmentManager 来在配置更改(例如方向更改)上保留缓存。在我的情况下,我想在我真正“需要”它们之前预先下载图像。
有一个类似的问题,大多数答案建议使用getActivity()以获取片段的上下文,但如果片段是分离的(如果getActivity()返回null),如何获取对活动/上下文的引用?
我的情况是我的片段启动了一个AsyncTask,它在完成时会调用onSuccess()我片段的方法.但是我的片段onSuccess()方法需要一个上下文来显示Toast消息或访问共享首选项.那么获得上下文有可靠的方法吗?
我正在考虑的一种方法是将一个上下文对象传递给我的AsyncTask构造函数,并将其传递回我前面提到的onSuccess()回调方法 - 但是这会导致内存泄漏吗?
(NB -这里有一个答案在这里显示了如何检索当前活动,但同样,它需要一个有效的上下文.)