标签: android-lifecycle

有一个活动实例

我有一个活动导航和后台堆栈的问题,我希望你能为我清理它.

问题

根活动>>> 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 android-intent android-lifecycle android-activity

21
推荐指数
2
解决办法
3173
查看次数

屏幕打开时,Wi-Fi或CPU是否可以进入睡眠状态?

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或移动数据连接是否会进入休眠状态?

android android-networking android-lifecycle

21
推荐指数
1
解决办法
1000
查看次数

我可以通过检测测试来杀死并重新启动应用程序进程吗?

我需要测试应用程序从干净状态启动的用例 - 即在测试开始之前进程尚未运行.从我从logcat看到的,所有的测试测试都在一个单独的流程实例/会话下运行,因此我的测试结果取决于它是否以#1运行.不应该这样 - 我们都知道,单元测试(或仪器测试)应该是自主的.

有没有办法使用标准的Android检测工具和函数我可以强制TestRunner在给定的测试之前重启过程?如果没有,是否有黑客或第三方图书馆可以帮助我实现这一目标?或者有什么方法我可以特别说测试X 必须先运行(最坏的选择,但仍然)?

具体来说,我的测试涉及通过意图启动活动FLAG_ACTIVITY_CLEAR_TOP,除了活动启动模式(例如singleTop)和过程状态之外的意图标志(例如)非常规定了测试的结果.

android unit-testing android-lifecycle android-instrumentation

21
推荐指数
1
解决办法
645
查看次数

:当 getView() 为 null 时,即在 onCreateView() 之前或 onDestroyView() 之后,无法访问片段视图的 LifecycleOwner

我在我的应用程序中使用实时数据进行所有网络调用和响应处理。

在其中一种情况下,我的回收器视图正在其视图持有者的视图中加载一些数据,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

android android-lifecycle android-recyclerview

21
推荐指数
3
解决办法
1万
查看次数

Android应用程序组件破坏和娱乐的详细信息

有人会把我推向一些具体的,值得信赖的(最好是简明的)有关以下方面的信息:

  1. 系统重新创建组件的顺序和(如果适用)(片段,活动,活动的线程/ AsyncTasks /定时器,静态数据(何时卸载类?),其他类中的线程/ AsyncTasks /定时器,主机TabActivity,当应用程序在后台和前台时,ActivityGroup,绑定本地服务,应用程序,进程).
    破坏可以在哪些点停止(返回应用程序时会遇到什么状态 - 比如"包括应用程序对象在内的所有状态都被破坏,进程处于活动状态"?

  2. 是否有可能(不修改Android)以编程方式自己导致相同类型的破坏,因此它与系统何时进行无法区分,或者是当我们自己选择释放内存时需要的单独机制(由onLowMemory触发)?

  3. 来自1)的所有场景的可靠再现步骤(junit.framework会吗?我还没有调查过)?

  4. " 如果用户长时间离开任务,系统将清除除根活动之外的所有活动的任务.当用户再次返回任务时,只恢复根活动 ":这是否与进程/组件不同生命周期/破坏,还是与之相关?

我已阅读各种来源提供信息,通常不完整和误导,有时不正确.
我承认,我已经浏览了文档的某些部分,所以我可能错过了或误解了一些东西.

[编辑]为了避免误解:我要问的是Android破坏组件以释放内存,绕过 Activity.onDestroy.
当我将应用程序放在后台并稍后返回时,将出现以下序列之一:

  • onPause,onStop,onRestart,onStart,onResume
  • onPause,onStop,Application.onCreate,onCreate(notNull),onStart,onResume

[EDIT2] Bounty开始了.需要可靠的信息:活动,碎片,应用程序,绑定(可能是远程)服务,流程.
部分/完全销毁方案.见第1点.

android android-lifecycle android-activity

20
推荐指数
1
解决办法
1659
查看次数

在Activity.onCreate()中,为什么Intent.getExtras()有时会返回null?

这可能是一个误报,请参阅我自己的答案.原始问题如下:

活动有一个按钮,可以将用户带到另一个活动.为了启动新活动,我们使用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

20
推荐指数
2
解决办法
2万
查看次数

为什么在返回父活动时始终会调用onDestroy?

我有一个非常简单的应用程序基于构建您的第一个应用程序教程.有两种活动: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()首次启动子活动时不会发生,但只会单击一次后退按钮.

两个问题:

  1. 有没有办法防止父母在常见情况下被摧毁?
  2. 为什么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().

android android-lifecycle android-activity

20
推荐指数
1
解决办法
5524
查看次数

在没有onpause()或onstop()的情况下调用ondestroy()的Android场景

几天前,我被要求写下调用ondestroy()的场景,而不调用onpause()或onstop().可能吗.如果是,请解释.

android android-lifecycle android-activity

20
推荐指数
2
解决办法
1万
查看次数

在android中实现Socket.io的最佳方法

我计划在这个库中为基于聊天的应用程序在android中实现Socket.io .据我所知,图书馆看起来很不错.我想知道如何在整个应用程序中始终保持单个套接字连接?在这里,我列出了实现的方法,其中我需要最好和最稳定的方式.

三种方式

MainApplication类扩展了Application

通过这种方式,我们有一个很好的范围,即在主线程(或应用程序的生命周期)中维护套接字连接,并且每当从活动中需要套接字实例时我们都可以轻松获得它.但它的主要线索也是问题所在.它可能会阻止主线程.

BoundService

通过这种方式,我们可以服务与活动绑定,我们可以简单地使用它.在单独的线程中执行是实现IO /网络调用的方法.但是,交叉处理转移比在同一过程中直接访问更昂贵.

独生子

在Singleton中维护连接也很有意义.但是我们不知道实例何时被进程杀死,因为它在活动生命周期中不起作用.

如果我有意义,请帮助我.如果没有评论出来.

编辑

我已经给出了更适合我的答案.

java sockets android android-lifecycle socket.io

20
推荐指数
2
解决办法
7547
查看次数

BroadcastReceiver的Manifest和Programmatic注册之间的主要区别

我试图理解在Manifest中注册BroadcastReceiver和以编程方式注册它之间的主要区别...

我的理解基本如下(如果我遗漏了某些东西,我会感谢有人纠正我的观点).

  • 在Manifest中注册:

    1. 如果需要,操作系统将神奇地查找并实例化您的类,调用onReceive()方法,无论您的应用程序的运行状态是什么
    2. 您的接收只会在每次广播时被呼叫一次(即您可以认为在清单中注册就像注册您的"班级"以接收广播一样 - 并且广播会根据需要实例化您的班级)(??)
  • 以编程方式注册:

    1. 在代码中注册意味着您正在注册您的类的实例以接收广播消息(即,如果您的代码有点草率,并且您设法多次注册,则最终会有多个BroadcastReceiver实例都调用其onReceive()广播
    2. 要取消注册,您需要取消注册先前注册的特定BroadcastReceiver实例
    3. 如果您的应用程序被操作系统销毁,则不会为广播调用onReceive()方法

谢谢

android broadcastreceiver android-lifecycle

19
推荐指数
2
解决办法
6954
查看次数