打开活动实例

时间:2016-05-28 10:51:48

标签: android android-fragments android-activity out-of-memory

我有一个应用程序,用于保存活动中的帖子信息。在此活动相关帖子列在帖子底部。用户通过点击相关帖子可以去发布活动并查看帖子信息和相关帖子。

Figure

正如您在图片中看到的,我有活动A ,其中包含帖子及其相关帖子。当用户点击帖子后,我将用户发送到具有新帖子ID的活动A ,并按新数据填写活动。

但我认为这不是正确的方法!

我应该使用Fragment代替Activity吗?

7 个答案:

答案 0 :(得分:1)

在另一个实例上打开另一个活动实例是导航内容图的最简单方法。用户只需按回,然后转到之前打开的内容,直到用户返回到启动活动,然后应用程序关闭。虽然非常简单,但这种特殊方法有两个问题:

  1. 可能会发生很多具有相同活动的实例在堆栈上,利用内存等大量设备资源。

  2. 您对活动堆栈没有细致的控制权。您只能启动更多活动,完成某些活动,或者必须使用FLAG_CLEAR_TOP等意图标记。

  3. 还有另一种方法,即重新使用相同的Activity实例,在其中加载新内容,同时还记住已加载内容的历史记录。就像网页浏览器与网页网址一样。

    目标是保持目前为止查看的Stack内容。加载新内容会将更多数据推送到堆栈,而后退会从堆栈中弹出顶级内容,直到它为空。活动UI始终显示堆栈顶部的内容。

    粗略示例:

    public class PostActivity extends AppCompatActivity {
        // keep history of viewed posts, with current post at top
        private final Stack<Post> navStack = new Stack<>();
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            // get starting link from intent extras and call loadPost(link) 
        }
    
        private void loadPost(String link){
            // Load post data in background and then call onPostLoaded(post)
            // this is also called when user clicks on a related post link 
        }
    
        private void onPostLoaded(Post post){
            // add new post to stack
            navStack.push(post);
    
            // refresh UI
            updateDisplay();
        }
    
        private void updateDisplay(){
    
            // take the top Post, without removing it from stack
            final Post post = navStack.peek();
    
            // Display this post data in UI
        }
    
        @Override
        public void onBackPressed() {
            // pop the top item
            navStack.pop();
    
            if(navStack.isEmpty()) {
                // no more items in history, should finish
                super.onBackPressed();
            }else {
                // refresh UI with the item that is now on top of stack
                updateDisplay();
            }
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            // cancel any background post load, release resources
        }
    }
    

答案 1 :(得分:0)

我会选择:

活动/片段取决于复杂性:

  • 具有自定义扩展卡视图的水平回收视图
  • 并在此扩展卡片视图内第二个垂直Recyclerview:)

答案 2 :(得分:0)

这是你可以尝试的。

创建一个PostActivity,它是片段的shell。在此活动中,您只需使用FragmentTransaction替换片段。

您的PostActivity现在可以拥有PostFragment来保留帖子和相关帖子。现在点击帖子,您可以将PostFragment替换为PostDetailFragment,并将postID作为捆绑发送到新片段。 PostDetailFragment现在将根据ID显示详细信息。

点击此处:http://www.vogella.com/tutorials/Android/article.html#components_fragments

答案 3 :(得分:0)

通过查看图片我将实现的方式是我将为您的项目创建一个带有底部列表视图的活动,并且在顶部会有一个用于保存片段的framelayout。当用户点击任何列表项时,我会在活动中加载相应的片段

答案 4 :(得分:0)

这完全取决于你想要达到的目标。当用户在降低几个级别后触摸后退按钮时,您会发生什么?如果您希望应用程序退出,无论它们的顺序有多深,那么我认为最好的解决方案是简单地使用新数据重新加载相同的活动并使受影响的视图无效。如果您需要后退按钮将用户带回以前的数据,那么下一个问题就是您是否跟踪过去的数据痕迹。如果是这样,那么只要在堆栈中有数据时拦截后退按钮并加载先前的数据,或者如果到达顶部则退出。如果您不想跟踪以前的数据链,那么您可以使用新数据启动同一类的新活动,而不是使用新数据加载一个活动。 Android保持跟踪活动和每个后退按钮触摸将关闭运行活动并将用户带到上一个活动。活动与片段的选择只是你的。您可以使用包含每个用户触摸后要更改的数据的片段,在需要时创建新片段,断开之前的片段,然后连接新片段。您需要做一些额外的工作以确保后退按钮正常工作(取决于您希望后退按钮的行为)。根据我的判断,只需要一个活动并在需要时加载新数据并保持数据变化,如果您需要能够返回,则更简单。

答案 5 :(得分:0)

可以单独使用活动来实现。虽然我更喜欢将所有相关的UI移动到片段。

您可以使用Navigator类。

这里的步骤:
 的 1。添加导航器类

public class Navigator {

  private static Navigator instance;

  public synchronized static Navigator getInstance() {
    if (instance == null) {
      instance = new Navigator();
    }
    return instance;
  }

   public void navigateToActivityA(Context context) {
      Intent activity= AActivity.getCallingIntent(context);
      context.startActivity(activity);
  }
}

<强> 2。将调用方法添加到Activity类。

public static Intent getCallingIntent(Context context) {
return new Intent(context, AActivity.class);
}

第3。在您的来电活动中使用以下代码调用活动。

Navigator.getInstance().navigateToActivityA(this);

我建议您阅读AndroidCleanArchitecture

答案 6 :(得分:0)

完成这项任务......

0)开始新活动

我再次阅读有关问题的内容,并了解您需要有关开始活动的建议。所以,开始新的活动它没问题,你的主要问题将是另一件事(见下文)。

但是让我们谈谈开始另一个数据。使用Fragment而不是解决您的任务,片段有助于不同的屏幕工作。例如,仅使用数据刷新作为变体。您可以仅使用单个活动并仅刷新数据,如果您还添加动画,它看起来会更好,但不会比启动活动更好。

使用Fragment可以帮助您完成不同的屏幕操作。也许,回答你的问题 - 它将是最合适的解决方案。你只需使用单一活动 - PostActivity和几个片段 - FragmentMainPost,FragmentRelated - 它们将通过从相关帖子中选择而相互替换。

1)返回问题

让我们想象一下,用户点击新活动并加载新数据。没关系,当用户点击100多个活动并收到大量信息时。也没问题。但主要问题是它返回(另一个关于缓存的问题,但现在就让它离开)。

所以每个人都知道,在堆栈中保存大量活动是个坏主意。因此,对于我的每个应用程序,我们都会在此活动中覆盖onBackPressed。但是如何,让我们看看下面的流程:

//Activities most have some unique ID for saving, for ex, post number. 
//Users clicks to 100 new activities, just start as new activity, and
//finish previous, via method, or setting parameter for activity in AndroidManifest 
<activity
   noHistory=true>
</activity>

 ....

//When activity loaded, save it's activity data, for ex, number of post 
//in some special place, for example to our Application. So as a result 
//we load new activity and save information about it to list
 ....

// User now want return back. We don't save all stack this activities, 
// so all is Ok. When User pressing back, we start action for loading 
//activities,  saved on our list..

.....

   onBackPressed () {
      //Getting unique list
       LinkedTreeSet<PostID> postList =    
            getMyApplication().getListOfHistory();

      //Getting previous Post ID based on current
      PostID previousPostID = postList.get(getCurrentPost());

      //Start new activity with parameter (just for ex)
      startActivity(new Intent().putExtra(previousPostID));

   }

<强> RESULT

我发现这是此任务的最佳解决方案。因为在每一次 - 我们只与单一活动合作!