Articles of android activity

前台(顶部)活动(应用程序)更改时如何通知

我想为Android平台编写一个服务,当前台活动发生变化时会通知该服务。 基本上,只有在顶级活动发生变化时,服务才能执行某些任务。 有什么方法可以订阅并在发生此类事件时收到通知吗? 或者没有可能,服务应该不时轮询正在运行的活动列表并检查前台活动是什么?不是更好的解决方案……

为什么`android:screenOrientation =“背后”`在android 4.1.2中没有效果?

作为测试样本,应用程序有2个活动:MainActivity在按钮单击时启动SecondActivity。 它在Android 4.0.4上工作正常,但在Android 4.1.2上我遇到了意外行为。 系统设置中的AutoRotation已关闭(或打开 – 无关紧要,无论如何都会忽略“后面”选项)。 android:screenOrientation=”landscape”是为MainActivity设置的,而android:screenOrientation=”behind”是为SecondActivity设置的,这意味着SecondActivity也必须以横向方式启动。 适用于Android 4.0.4,但在Android 4.1.2上,SecondActivity以纵向方向开始。 AndroidManifest.xml中: SecondActivity.java: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); logOrientation(“onCreate”); } @Override protected void onDestroy() { super.onDestroy(); logOrientation(“onDestroy”); } @Override protected void onResume() { super.onResume(); logOrientation(“onResume”); } private void logOrientation(String prefix) { int requestedOrientation = this.getRequestedOrientation(); WindowManager lWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE); Configuration cfg […]

Android中“FLAG_BLUR_BEHIND”的替代?

我可以看到,当我使用API​​演示中显示的相同标志来模糊背景时,我得到一个警告,它已被弃用: “不推荐使用WindowManager.LayoutParams.FLAG_BLUR_BEHIND字段”。 我已经读过它了,我发现“不再支持模糊”了。 这是否意味着它不适用于未来的版本? 他们为什么弃用它? 还有其他选择吗? 我真的很喜欢这个function。

活动方法:onCreate()和onDestroy()

当第一次创建活动时,系统调用OnContentChanged()方法作为第一个方法,系统的最后一次调用是一个活动被杀死时的OnDetachedFromWindow()方法,但是android文档说活动的整个生命周期发生在OnCreate()之间OnCreate()和OnDestroy() 。 为什么? 请帮助我理解这些方法之间的区别。 码: import android.app.Activity; import android.content.res.Configuration; import android.os.Bundle; import android.widget.Toast; public class ActivitylifecycleActivity extends Activity { /** Called when the activity is first created. */ @Override public void onContentChanged() { super.onContentChanged(); Toast.makeText(getApplicationContext(),”1. onContentChanged()”, Toast.LENGTH_SHORT).show(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Toast.makeText(getApplicationContext(),”2. onCreate()”, Toast.LENGTH_SHORT).show(); } @Override public void onStart() { […]

如何在Android中创建始终如一的全屏叠加活动

我希望能够创建一个始终位于Android显示屏前面的活动。 它应该不会收到任何输入,只需将其传递给下面的下一个应用程序。 像HUD一样的东西。 我能够研究我需要将底层窗口types设置为TYPE_SYSTEM_ALERT,但看起来Android忽略了我的代码 – 即使我从清单中删除了android.permission.SYSTEM_ALERT_WINDOW权限也没有抛出exception。 (需要使用此窗口types)。 当我尝试在对话框上使用ALERTtypes时,它工作正常,但我无法将对话框设置为全屏透明实体。 这是我的代码,也许有一些简单的遗漏。 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); getWindow().setBackgroundDrawableResource(android.R.color.transparent); getWindow().setFormat(PixelFormat.TRANSLUCENT); setContentView(R.layout.main); } 必须在xml清单中外部启用半透明设置,否则它也不起作用。 true

当直接从通知启动活动时,如何构建Android后备栈?

我有两个活动: 活动A – 项目清单 活动B – 项目的详细视图 通常,用户打开应用程序并启动活动A. 用户查看项目列表,单击一个项目,然后启动活动B以显示项目详细信息。 也可以通过单击通知直接启动活动B. 在这种情况下,没有后栈。 如何才能使活动B直接从通知启动时,用户可以单击“返回”按钮并转到活动A?

最简单的Android活动生命周期

我注意到Android开发者活动部分自我启动应用程序以来已经更新,但我仍然不清楚最简单的活动生命周期是什么。 据我所知: onCreate,onResume和onPause是必不可少的。 在onPause之后的任何时候都可以删除活动,因此我应该将整个应用程序状态保存到onPause文件中,而不是依赖onStop或onDestroy。 此外,onSaveInstanceState在每个onPause之前都没有被调用,因此不值得使用。 而不是尝试编写大量代码来处理所有场景,为什么不在onPause结束时销毁Activity? 然后,生命周期将在onCreate和onResume处于活动状态之前,然后在其变为非活动状态时为onPause。 不需要其他方法。 我使用onCreate调用setContentView并设置视图侦听器,但其他所有内容都将放在onResume中,包括从文件中加载恢复的状态? 如前所述,onPause会将状态保存到文件中并销毁活动。 据我所知,唯一的缺点可能是当屏幕上显示popup窗口时,活动将被删除,并且必须在popup窗口关闭时重新创建,这意味着活动将不会在popup窗口后面显示(尽管我没有测试过这个) 重新启动活动可能需要更长的时间,但由于系统可能在没有任何通知的情况下删除了活动,因此无论如何都必须保存整个状态。 有什么想法吗? 更新:我想我想到的是“首页”活动所谓的游戏活动。 当玩家点击“播放”时,首页活动会调用游戏活动 游戏活动将在onCreate中设置其视图和监听器等,并且在onResume中它将加载包含游戏状态的文件,或者如果不存在文件则开始新游戏。 onPause游戏,它将游戏状态写入文件,然后无论游戏活动发生什么(没有,或被停止/销毁,或其他),onResume方法将始终从文件中重新加载所有数据。 这有点像我在想的,如果这有道理的话? 更新2:我已经设计了一个简单的解决方案,我已在下面的答案中记录,如果有人感兴趣的话! 它不支持Android Activity Lifecycle’Paused’和’Stopped’状态。 一旦它不再显示它就会自动杀死并且必须手动重启,但它会从你离开的地方继续运行!

Espresso如何测试Activity是否完成?

我想声明我正在测试的Acitivty在执行某些操作时已完成。 不幸的是到目前为止,我只是通过在测试结束时添加一些睡眠来断言它。 有没有更好的办法 ? import android.content.Context; import android.os.Build; import android.support.test.rule.ActivityTestRule; import android.test.suitebuilder.annotation.LargeTest; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import static org.junit.Assert.assertTrue; @SuppressWarnings(“unchecked”) @RunWith(JUnit4.class) @LargeTest public class MyActivityTest { Context context; @Rule public ActivityTestRule activityRule = new ActivityTestRule(MyActivity.class, true, false); @Before public void setup() { super.setup(); // … } @Test public void […]

如何区分是否将onDestroy()作为配置更改序列的一部分进行调用?

在我的Activity中,需要在onDestroy()中销毁一些外部事物(服务)。 但是当配置发生变化时(例如键盘翻转),我不希望这样,因为它会立即恢复。 所以问题是:如何区分onDestroy()是否是由Back-key press或部分配置更改过程引起的? 在@ CommonsWare的回答之后它会非常简单)类似于: @Override onDestroy() { if (mIsChangeConfig == true) { mIsChangeConfig = false: } else { stopService(); } } @Override onRetainNonConfigurationInstance() { mIsChangeConfig = true; }

多次阻止打开活动

我的应用程序上有一个带图标的常用菜单。 单击图标将启动活动。 有没有办法知道某个活动是否已经在运行并阻止它多次启动(或从多个条目启动)? 我也可以将处于onPause状态的活动带到前面吗?