2011-04-20 124 views
2

首先,我将解释我处于我的应用程序中的情况,然后讨论我的主要问题。首先,我想知道我处理活动的方式是否是处理活动的正确方式,因为我认为这可能不会导致我的问题。Android:处理活动的正确方法

目前我有3个活动设置。 Main.class,Login.class和Display.class。主要活动根本没有任何关联的UI,它启动其他活动。因此,启动应用程序时启动的第一个活动是Main活动,它会从SharedPreferences存储中读取并读取用户是否登录。如果它们未登录,它将打开Login。类,如果他们已经登录,它会打开Display.class(两者都有与之关联的UI)。它使用startActivityForResult()。

由于我决定去处理活动,我需要重写Login.class和Display.class上的后退按钮:否则,它将返回到Main.class,并重新运行启动活动序列,它将重新启动刚刚运行的活动(因此后退按钮无用)。所以,我覆盖了后退按钮发回一个-1的整数,然后完成()当前活动。我重写了Main.class的onActivityResult(int,int,Intent),如果它接收到-1,它也会完成(),而不是试图重新启动活动。

现在,这一切都为我的需要而工作,尽管我有一种感觉,这是完全错误的方式来处理活动,并且这会给我以后的问题带来麻烦。

在我的应用程序中,我决定将一个应用程序窗口小部件和一个通知放入,这两个窗口都会在点击时打开应用程序(通过启动Main.class的意图)。我已经完成了所有工作,以便它能这样做,尽管看起来开始一个新的活动会导致问题。

会发生什么基本上是,如果应用程序已经在运行,并且有人拉下通知并点击它,它会打开同一应用程序的新活动。这是有问题的,尤其是我处理后退按钮的方式:当您打开一个新按钮并按下后退按钮时,它将关闭新按钮(如预期的那样),但会将您带回旧的按钮。然后您可以再次按下后退按钮并退出,但显然我不想发布需要按下后退按钮两次的应用程序。解决这个问题的最好方法是什么?如果这是问题的主要部分,我很乐意完全改变我处理活动的方式。

谢谢, 乔希。

+0

+1有关重新思考方法的良好讨论。我试图通过在活动之上有一个Application类来解决这个问题。我在下面发布了一个例子。 – Aleadam 2011-04-20 05:00:20

回答

1

其实你如何设置-1(这很好),然后调用finish()是完全可以接受的。我忘记了属性值,但是如果您只想要一个Activity的单个实例,则可以在清单中设置该属性...任务关联或其中一个值 - 您必须查看它。

作为替代方案,您可以覆盖Application类并使用您自己的方法来管理应用程序状态。把它看作主Activity的单例追踪器。“如果它已经存在使用那个,否则创建一个新实例”。在创建主Activity时,在你新扩展的Application类中设置一个引用(当main关闭时确保你将它清空),然后检查onCreate()再次触发时是否有引用。如果有参考已经在那里使用Main的实例..如果没有,按正常进行并设置它。

深思...

+2

感谢您更改清单的建议。我最终在登录和显示(不是主)的标记中放置了android:launchMode =“singleTop”,它运行良好。我第一次尝试了singleInstance,但由于某种原因,setResult停止了工作,但它们全部是相同的文档。链接到Android开发文档:http://developer.android.com/guide/topics/manifest/activity-element.html – joshhendo 2011-04-20 05:53:26

+0

是的。我不记得该属性的名称,但我记得读过它。用于在Windows CE和Windows Mobile应用程序中具有类似的结果。找到它的好工作。 – BonanzaDriver 2011-04-20 05:57:30

1

我有一种感觉,我不完全理解问题的深度,所以请原谅我,如果我说的话,你已经尝试过。

但难道你不能删除主要和启动显示登录?我的意思是,更有意义。这就是我在这里所做的一切,当我需要辅助活动时,必须填写主要活动的数据(显然这是您的案例中的显示)。当你从登录处返回时,你可以做所有你需要的检查。你可以允许一个“只读”显示,你可以提供一个对话框警告......

你会节省很多麻烦和无用的代码的确(大多数结果/意向面条)。

+0

起初我认为这将是一个好方法,我认为它仍然是。我的思路是我可以有一个Main类,它通过setResult()来处理所有事情,而不是在其他人的基础上构建。当然,在一个小应用程序中,你的方式可能会更好。如果我重新做这个应用程序或做出另一个类似的应用程序,我可能会这样做。谢谢! – joshhendo 2011-04-20 05:56:08

+0

不客气。很高兴你找到了一种方法来使它工作。我对singleTop,singleTask,singleInstance等方面的知识不太了解,所以感谢您在这里发布。 – davidcesarino 2011-04-20 14:52:56

1

一个可行的办法是具有延伸Application一类,并绑定了几个Activity秒。一个private boolean logged的值可以确定Display是否需要调用LogIn为前景。

public class MyApp extends Application { 
    private static boolean logged = false; 
    private Activity logInActivity; 
    private Activity displayActivity; 
    public void onCreate() { 
     super.onCreate(); 
    } 
    public void setDisplayActivity (Activity act) { 
     displayActivity = act; 
    } 
    public void setLogInActivity (Activity act) { 
     logInActivity = act; 
    } 
    public void finishActivities (Activity act) { 
     activity.finish(); 
    } 
    public void setLogged (boolean logged) { 
     this.logged = logged; 
    } 
    public boolean isLogged() { 
     return logged; 
    } 
    public Activity getLoginActivity() { 
     return logInActivity; 
    } 
    public Activity getDisplayActivity() { 
     return displayActivity; 
    } 
} 

class Display extend Activity { 
    private MyApp app; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     app = (MyApp) getApplicationContext(); 
     if (!app.isLogged()) { 
      // start LogInActivity. After log in, it will call app.setLogged (true); 
     } 
     else { 
      // continue with Display; 
     } 
    } 
} 
+0

绝对不是我以前的方式。感谢您的建议,我对Android开发很陌生,所以仍然在学习活动,意图,应用程序等方面的工作。我肯定会参考我的下一个Android应用程序。 – joshhendo 2011-04-20 05:54:35

相关问题