Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么可以';我不能通过参考发起活动吗?_Android_Android Fragments_Android Activity_Android Lifecycle - Fatal编程技术网

Android 为什么可以';我不能通过参考发起活动吗?

Android 为什么可以';我不能通过参考发起活动吗?,android,android-fragments,android-activity,android-lifecycle,Android,Android Fragments,Android Activity,Android Lifecycle,《Android开发者指南》指出,活动是通过意图启动的: Intent intent = new Intent(this, SignInActivity.class); startActivity(intent); 对于片段,通常在屏幕上显示的方式如下: ExampleFragment fragment = new ExampleFragment(); fragmentTransaction.add(R.id.fragment_container, fragment); fragmentTra

《Android开发者指南》指出,活动是通过意图启动的:

Intent intent = new Intent(this, SignInActivity.class);
startActivity(intent);
对于片段,通常在屏幕上显示的方式如下:

ExampleFragment fragment = new ExampleFragment();
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();
为什么在一种情况下我必须指定一个类,而在另一种情况下我必须指定一个对象?也就是说,我想用

Activity nextActivity = new SignInActivity();
Intent intent = new Intent(this, nextActivity);
startActivity(intent);

添加片段时,您已经指定了将该片段插入的确切位置。所以,理想的方法是

  • 创建你的片段
  • 插入到当前活动的布局中
  • 使用事务删除/管理添加到当前活动中的片段

  • 在任何情况下,您都不能只启动或使用片段,而不将其附加到现有活动。

    因为
    活动
    生命周期由Android管理,而
    片段
    生命周期与包含它的活动相关联

    如前所述,
    活动
    生命周期由Android管理。这是Android管理系统资源和处理后台堆栈所必需的

    另一方面,引入了
    片段
    ,以模块化和更好地组织不同大小设备的UI。根据文件规定:

    从蜂巢开始,
    活动
    实现可以利用
    Fragment
    类为了更好地模块化他们的代码,构建更多 用于更大屏幕的复杂用户界面,并有助于扩展 小屏幕和大屏幕之间的应用


    要回答问题的后一部分,您确实可以将活动的结果传递给第二个活动。但是您永远不应该为此创建
    活动
    类的实例。正确的方法是使用
    startActivityForResult()
    ,并通过
    Intent

    将结果值发送到目标活动,Android自己处理活动生命周期。看看Activity类的方法,它们就像是在填补空白。安卓在这里发号施令。通过这些方法,它只会在创建、恢复、暂停此活动时询问您是否要执行某些操作

    Android在内部处理活动生命周期的原因有很多:

  • 正确地设置一个活动涉及到大量的锅炉板代码,最好让系统为您完成它。整个
    上下文
    窗口管理
    都是在幕后为您设置的。想象一下,如果你必须为你创建的每一项活动做额外的工作,那么会有多少额外的工作

  • 活动是共享的,主屏幕和其他应用程序可能希望启动/使用它们。如果他们必须调用某个模糊包的
    newmyactivity()
    ,这怎么可能呢。这就是为什么活动和其他外部可调用组件必须在应用程序清单中声明的原因

  • 来自许多应用程序的活动可以是android任务的一部分(从用户的角度来看,这是一项工作)。和自动放置/移除/重新排列在后堆叠上。同样,安卓系统更好地管理它们的创建和销毁,而不是让开发人员搞砸整个设置

  • 所有用户关心的是,一个活动必须在被要求时显示,如果用户导航到其他地方,就不要挡道。Android强制执行这一点。仅仅因为允许以这种方式编程,就让一个活动自行出现,或者拒绝离开,这是不可接受的


  • 另一方面,碎片是内部的。它们位于活动内部,不以任何方式从外部应用程序或任务访问或与外部应用程序或任务共享。片段甚至不是应用程序清单的一部分,因此不会暴露在外部。Android不需要单独考虑每个片段,因为片段生命周期与其父活动的生命周期相关联。Android不在乎你在内部如何处理碎片,它可以结束活动,并销毁其中的所有内容。

    你可以使用(自定义)操作。否?+1这就是为什么为活动和片段创建显式构造函数(带参数)不是一个好主意。您能否解释一下生命周期管理的要求(
    onCreate
    onResume
    ,等等)与活动必须由系统实例化的要求有关吗?它与Android的设计有更多的关系。Android只识别活动/服务。。在舱单中声明的。AFAIU,否则,它监视创建的每个对象以检查它是否属于上述类之一将是一件麻烦和低效的事情。因此,用户创建的对象被视为普通Java对象。因此,Android不可能管理其生命周期。应该给你一个系统如何控制活动的概述。我觉得这个答案的大部分并没有解决这个问题。我将试着回应你的观点:1。设置活动可以在其构造函数中完成,子类可以重用该构造函数。避免使用样板文件不是一个问题。2.我不是建议删除
    startactivity
    ,而是建议可以传递先前构造的活动实例,而不是类对象。对于其他应用程序,它们引用的是一个类还是某个晦涩包的构造函数并不重要。对于已经创建的活动实例,是否有任何原因不可能进行backback操作?4.对不起,我看不出和这个问题有什么关系。