以编程方式定义默认活动(当应用程序启动时)

Posted

技术标签:

【中文标题】以编程方式定义默认活动(当应用程序启动时)【英文标题】:Define Default Activity (when app starts) programmatically 【发布时间】:2011-06-27 19:13:24 【问题描述】:

我的应用程序由一些活动组成。

Activity A 是我的主菜单,带有一些图标。 此 Activity 可以根据您按下的图标启动:Activity B、C、D、E 或 F。

这很好,也很简单,Activity A 是默认的。

现在,我做了一个优先选项,允许用户开始他们最喜欢的活动。

例如,实际上有些用户更喜欢直接获取 Activity B。

我找到解决方案的唯一方法是在 Activity A 中执行此操作此解决方案非常丑陋,因为 Activity A 将始终自动启动和关闭:

public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);

    settings = PreferenceManager
            .getDefaultSharedPreferences(getBaseContext());
    final Intent intent = getIntent();
    String action = intent.getAction();

    if (Intent.ACTION_MAIN.equals(action)) 
        switch (Integer.valueOf(settings.getString("Activitypref", "1"))) 
        case 2:
            Intent i = new Intent(ActivityA.this, ActivityB.class);
            finish();
            startActivity(i);
            break;
        case 3:
            i = new Intent(ActivityA.this, ActivityC.class);
            finish();
            startActivity(i);
            break;
        case 4:
            i = new Intent(ActivityA.this, ActivityD.class);
            finish();
            startActivity(i);
            break;
        case 5:
            i = new Intent(ActivityA.this, ActivityE.class);
            finish();
            startActivity(i);
            break;
        case 6:
            i = new Intent(ActivityA.this, ActivityF.class);
            finish();
            startActivity(i);
            break;
        default:
            break;
        
     

【问题讨论】:

如果 Activity A 的唯一目的是决定启动哪个其他 Activity,那么我不认为这是一个丑陋的解决方案。听起来 Activity A 正在完成它的工作。 是的,但用户可以选择“绕过”此活动并直接进入活动 X。当设置为首选项时,我不希望启动活动 A,除非用户按下我的主页按钮,在享受了 Activity X 之后。 最烦人的是加载时间和屏幕在启动 Activity A 并将其关闭到“onCreate”时闪烁 您可以创建一个扩展“应用程序”的类并让它决定启动哪个活动。在清单的“应用程序”选项卡的“应用程序属性”部分中,您必须将“名称”分配给扩展它的类的名称。由于它不应该处理 UI,因此它听起来像是 switch 语句的好地方。不过删除“finish()”调用。 【参考方案1】:

考虑使用从启动器调用的包装器活动,而不是ActivityA。您将无需检查 ACTION_MAIN。您还可以将目标活动名称存储在首选项中,并使用它通过不同的意图签名直接启动您的目标活动:

public Intent (String action)

 <activity class=".StartActivity" android:label="...">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
 </activity>

 <activity class=".ActivityA" android:label="...">
             <intent-filter>
                 <action android:name="mypackage.ActivityA" />                    
             </intent-filter>
 </activity>

在 StartActivity 中

public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);

    settings = PreferenceManager
            .getDefaultSharedPreferences(getBaseContext());

    String action = settings.getString("Activitypref","mypackage.ActivityA");
    Intent intent = new Intent(action);
    startActivity(intent);
    ....

你可能需要稍微摆弄一下才能把它弄好。

【讨论】:

您好 ALex,您的解决方案似乎正是我正在寻找的,但不幸的是,我不明白您的意思.. 我觉得有点愚蠢,但你是一个小 sn-p 还是例子? 我添加了更新。我现在无法访问我的 Android 代码,因此您可能需要修改它以使其正确。 答案很好,但是你的 wrapper 就像我之前的 ACactivity A 一样,让屏幕闪烁一点(StartActivity 启动然后 ACtivityA)然后,我也需要完成它,这和之前完全一样,其实.. 您能否详细说明一下,我应该将什么值传递给startActivity() 方法?我正在尝试根据某些条件运行一项预定义的活动。

以上是关于以编程方式定义默认活动(当应用程序启动时)的主要内容,如果未能解决你的问题,请参考以下文章

如何修复在 Android 中崩溃的活动的重新启动?

在 Android 2.2 中以编程方式启动“添加帐户”活动

如何以编程方式“重新启动”android应用程序[重复]

在 iOS 中以编程方式减少因后台活动而导致的电池消耗

在 Android 中以编程方式从启动器中删除应用程序

以编程方式启动 Google 应用引擎实例