我有一个活动导航和后台堆栈的问题,我希望你能为我清理它.
问题
根活动>>> SecondActivity >> HomeButton
这然后带我到主页,从那里我选择...
Gmail >>消息>>在我的应用程序中打开附件>> ImportActivity >> RootActivity
结果是正在启动一个新任务,并且正在使用我的应用程序的另一个实例.这是不可接受的,因为我不想运行两个单独的任务我只想要一个.
期望的结果
我想要发生的是当用户打开附件并且ImportActivity完成它正在做的事情(它已android:noHistory设置为true)和调用时startActivity(intent),RootActivity启动,但在原始任务中只保留一个实例和其余的活动(在这种情况下SecondActivity)被删除.
我想要这个的原因是,如果用户在导入文件后导航出我的应用程序,然后触摸应用程序图标,它会加载第一个任务及其后台堆栈,我有两个任务在运行,其中用户可以在两个不同的部分我的申请立刻.
我试过了什么
我玩过启动模式,但没有一个真正给我提供我需要的功能.
启动模式我试过..
android:launchMode ="singleTask" - 这只是每次启动时再次启动root活动.即使用户按下我的应用程序内的主页按钮并触摸了应用程序图标,也会破坏后面的堆栈.
android:launchMode ="singleInstance =不允许任何其他活动在任务中运行.
此外,当调用意图启动时,RootActivity我使用以下内容无济于事.
Intent i = new Intent(ImportActivity.this,TrackingActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
Run Code Online (Sandbox Code Playgroud)
有可能做我想要的吗?
提前致谢
Android上有WakeLocks和WifiLocks - 如果我的屏幕永远不会关闭,我是否需要这些?
我使用持久连接(例如WebSockets)几十分钟甚至几小时.我的屏幕是否总是足以防止设备丢失这些连接(如果我们假设连接仍然可用且服务器正常)?
为了保持屏幕,我使用标准方式:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
文档说的是什么:
为了避免耗尽电池,一个闲置的Android设备很快就会睡着了.
(https://developer.android.com/training/scheduling/wakelock.html)
通常,当用户暂时不使用设备时,Wi-Fi无线电可能会关闭.
(http://developer.android.com/reference/android/net/wifi/WifiManager.WifiLock.html)
这是否意味着......
当用户长时间不与设备交互时(即使屏幕仍然打开),Wi-Fi无线电或CPU可能会进入睡眠模式或关闭?
而且,更具体地说,IntentService当仍有Activity屏幕保持开启时,后台任务(例如)Wi-Fi或移动数据连接是否会进入休眠状态?
我需要测试应用程序从干净状态启动的用例 - 即在测试开始之前进程尚未运行.从我从logcat看到的,所有的测试测试都在一个单独的流程实例/会话下运行,因此我的测试结果取决于它是否以#1运行.不应该这样 - 我们都知道,单元测试(或仪器测试)应该是自主的.
有没有办法使用标准的Android检测工具和函数我可以强制TestRunner在给定的测试之前重启过程?如果没有,是否有黑客或第三方图书馆可以帮助我实现这一目标?或者有什么方法我可以特别说测试X 必须先运行(最坏的选择,但仍然)?
具体来说,我的测试涉及通过意图启动活动FLAG_ACTIVITY_CLEAR_TOP,除了活动启动模式(例如singleTop)和过程状态之外的意图标志(例如)非常规定了测试的结果.
android unit-testing android-lifecycle android-instrumentation
我在我的应用程序中使用实时数据进行所有网络调用和响应处理。
在其中一种情况下,我的回收器视图正在其视图持有者的视图中加载一些数据,onBind并且响应正在更新 UI。为此,我必须向lifecycleOwner观察者提供一个。
由于回收器视图没有自己的任何生命周期所有者,因此我正在使用父片段,parentFragment.viewlifecycleOwner但不知何故它给出了错误。
当父片段没有实例时,视图持有者如何拥有其实例?
viewModel.responseState.observe(parentFragment.viewLifecycleOwner, Observer {
updateUI(it)
})
Run Code Online (Sandbox Code Playgroud)
致命异常:java.lang.IllegalStateException:当 getView() 为 null 时,即在 onCreateView() 之前或 onDestroyView() 之后,无法访问 Fragment View 的 LifecycleOwner
有人会把我推向一些具体的,值得信赖的(最好是简明的)有关以下方面的信息:
系统重新创建组件的顺序和(如果适用)(片段,活动,活动的线程/ AsyncTasks /定时器,静态数据(何时卸载类?),其他类中的线程/ AsyncTasks /定时器,主机TabActivity,当应用程序在后台和前台时,ActivityGroup,绑定本地服务,应用程序,进程).
破坏可以在哪些点停止(返回应用程序时会遇到什么状态 - 比如"包括应用程序对象在内的所有状态都被破坏,进程处于活动状态"?
是否有可能(不修改Android)以编程方式自己导致相同类型的破坏,因此它与系统何时进行无法区分,或者是当我们自己选择释放内存时需要的单独机制(由onLowMemory触发)?
来自1)的所有场景的可靠再现步骤(junit.framework会吗?我还没有调查过)?
" 如果用户长时间离开任务,系统将清除除根活动之外的所有活动的任务.当用户再次返回任务时,只恢复根活动 ":这是否与进程/组件不同生命周期/破坏,还是与之相关?
我已阅读各种来源提供信息,通常不完整和误导,有时不正确.
我承认,我已经浏览了文档的某些部分,所以我可能错过了或误解了一些东西.
[编辑]为了避免误解:我要问的是Android破坏组件以释放内存,绕过 Activity.onDestroy.
当我将应用程序放在后台并稍后返回时,将出现以下序列之一:
[EDIT2] Bounty开始了.需要可靠的信息:活动,碎片,应用程序,绑定(可能是远程)服务,流程.
部分/完全销毁方案.见第1点.
这可能是一个误报,请参阅我自己的答案.原始问题如下:
活动有一个按钮,可以将用户带到另一个活动.为了启动新活动,我们使用extras和onCreate()填充我们的Intent,新活动通过Intent.getExtras()从这些额外内容中读取.我们假设返回的包是非空的,但是当发现客户崩溃报告时,getExtras()有时会返回null.
正如这个答案所示,无法保护额外内容是完全正常的,但是如果你填充了intent的附加内容,那么为什么它会在以后返回null呢?是否有更好的地方(如onResume())来阅读额外内容?
编辑:可能是因为我们没有遵循密钥所需的名称约定:
名称必须包含包前缀,例如app com.android.contacts将使用"com.android.contacts.ShowAll"之类的名称.
这是来自Intent.putExtras的javadoc.如果您不遵循此名称惯例会发生什么; 是甚至定义的行为?
这是相关的代码:
class FromActivity extends Activity {
ImageButton button;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.from_view);
button = (ImageButton)findViewById(R.id.button);
button.setVisibility(View.VISIBLE);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(FromActivity.this, ToActivity.class);
i.putExtra(ToActivity.SERVER_PARAM, ...);
i.putExtra(ToActivity.UUID_PARAM, ...);
i.putExtra(ToActivity.TEMPLATE_PARAM, ...);
startActivityForResult(i, 0);
overrideTransition(R.anim.slide_left_in, R.anim.slide_left_out);
}
});
}
}
class ToActivity extends Activity {
public static final String SERVER_PARAM = "server";
public static final String UUID_PARAM …Run Code Online (Sandbox Code Playgroud) java android android-intent android-lifecycle android-activity
我有一个非常简单的应用程序基于构建您的第一个应用程序教程.有两种活动:MainActivity调用DisplayMessageActivity通过startActivity().
进入时DisplayMessageActivity,我看到:
MainActivity.onStop()
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,但是当我按下后退按钮返回父母时MainActivity,我得到:
MainActivity.onDestroy()
MainActivity.onCreate(null)
MainActivity.onStart()
Run Code Online (Sandbox Code Playgroud)
对于这个非常简单的应用程序,活动总是被破坏.但根据文档(第二个要点),典型的行为是在这种情况下停止和重新启动活动.
此外,onDestroy()首次启动子活动时不会发生,但只会单击一次后退按钮.
两个问题:
null被传到onCreate()这里?这阻止了我保持状态onSaveInstanceState().请注意,我已经验证设置 - >开发者选项 - >应用 - >不要保持活动未选中.
编辑:
以下是子活动与父级链接的方式:
<activity
android:name="com.example.helloworld.DisplayMessageActivity"
android:label="@string/title_activity_display_message"
android:parentActivityName="com.example.helloworld.MainActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.helloworld.MainActivity" />
</activity>
Run Code Online (Sandbox Code Playgroud)
追踪DisplayMessageActivity.onOptionsItemSelected(),我可以看到它在呼唤Activity.onNavigateUp().
几天前,我被要求写下调用ondestroy()的场景,而不调用onpause()或onstop().可能吗.如果是,请解释.
我计划在这个库中为基于聊天的应用程序在android中实现Socket.io .据我所知,图书馆看起来很不错.我想知道如何在整个应用程序中始终保持单个套接字连接?在这里,我列出了实现的方法,其中我需要最好和最稳定的方式.
三种方式
MainApplication类扩展了Application
通过这种方式,我们有一个很好的范围,即在主线程(或应用程序的生命周期)中维护套接字连接,并且每当从活动中需要套接字实例时我们都可以轻松获得它.但它的主要线索也是问题所在.它可能会阻止主线程.
BoundService
通过这种方式,我们可以将服务与活动绑定,我们可以简单地使用它.在单独的线程中执行是实现IO /网络调用的方法.但是,交叉处理转移比在同一过程中直接访问更昂贵.
独生子
在Singleton中维护连接也很有意义.但是我们不知道实例何时被进程杀死,因为它在活动生命周期中不起作用.
如果我有意义,请帮助我.如果没有评论出来.
我已经给出了更适合我的答案.
我试图理解在Manifest中注册BroadcastReceiver和以编程方式注册它之间的主要区别...
我的理解基本如下(如果我遗漏了某些东西,我会感谢有人纠正我的观点).
在Manifest中注册:
以编程方式注册:
谢谢