区分从主屏幕启动的 Activity 或从 App 启动的另一个 Activity

Posted

技术标签:

【中文标题】区分从主屏幕启动的 Activity 或从 App 启动的另一个 Activity【英文标题】:Differentiating between an Activity launch from home screen or from another activity from App 【发布时间】:2011-08-04 00:26:15 【问题描述】:

我需要知道一种通用方法来区分来自启动器的活动调用和来自我的应用程序内部的另一个活动的调用,或活动堆栈上的 BACK

有人吗?这让我困扰了很长一段时间,我需要让它休息......

提前致谢 JQCorreia

【问题讨论】:

我不确定,但是您是否尝试过查看getIntent() 看看您是否发现了一些不同?!我想你应该会看到一些不同的动作...... 【参考方案1】:

在 Activity 的 onCreate 中,调用 getIntent()。如果 Activity 从启动器(主屏幕)启动,getAction() 的值将是 android.intent.action.MAINgetCategories() 将返回一个包含 android.intent.category.LAUNCHER 类别的集合。 如果活动从其他地方开始,这些值可能是null

【讨论】:

你是天使!哦,甜蜜的幸福!这是一个可耻的(至少我的耻辱)很多时间。 不工作,使用向上导航器时仍然获得 android.intent.category.LAUNCHER 类别。 我相信这种方法不适用于 back/up/finish() 情况,因为之前的 Activity 是按照之前的意图启动的。这可能仅适用于后台 Activity 被销毁并需要重新创建的情况。 可以使用常量Intent.ACTION_MAIN,而不是使用"android.intent.action.MAIN"的String值。 "android.intent.category.LAUNCHER" 字符串也是如此。请参阅下面的完整代码示例我的答案:***.com/a/37855016/1617737 .【参考方案2】:

除了@advantej 的回答之外,您还可以将每个启动调用扩展到该活动,为启动意图添加额外内容(例如intent.putExtra("caller", this.getClass().getSimpleName());

在活动的onCreate 方法中,您可以检查@advantej 的建议。

如果发起者不是主屏幕图标,那么您可以进一步检查intent.hasExtra("caller")是否返回true,如果是,它是什么。

【讨论】:

【参考方案3】:

你可以从intent flag中找到。

第一步:

  Intent intent = getIntent();
  int flag = intent.getFlag();

第 2 步:

if flag  =  Intent.FLAG_ACTIVITY_NEW_TASK 
  launch from other app or activities
else 
  launch from home page

【讨论】:

【参考方案4】:

在 2 种情况下 onRestart();调用,1.当活动来自后台时,2.当用户通过后退按钮到达活动时,示例解决方案: 使用 onBackPressed() 函数设置一个标志..所以你知道 onRestart 调用是因为按下后退按钮...... 在 onRestart() 中检查标志并重置它并....

【讨论】:

【参考方案5】:

基于advantej's answer,下面是一个完整示例,如果活动是从启动器图标启动的,它也会隐藏 UP 按钮:

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sell);

    /**
     * If this activity was started from launcher icon, then don't show the Up button in the action bar.
     */
    ActionBar actionBar = getSupportActionBar();
    if (actionBar != null) 
        Intent intent = getIntent();
        Set<String> intentCategories = intent.getCategories();
        boolean wasActivityStartedFromLauncherIcon = Intent.ACTION_MAIN.equals(intent.getAction()) && intentCategories != null && intentCategories.contains(Intent.CATEGORY_LAUNCHER);
        boolean showUpButton = !wasActivityStartedFromLauncherIcon;
        actionBar.setDisplayHomeAsUpEnabled(showUpButton);
    


【讨论】:

如果你想区分真正从启动器开始和屏幕旋转,那么你还需要检查给定的包是否为NULL。【参考方案6】:

这里是方便的方法,你不需要自己写:

protected boolean isStartedByLauncher() 
    if (getIntent() == null) 
        return false;
    
    boolean isActionMain = Intent.ACTION_MAIN.equals(getIntent().getAction());
    Set<String> categories = getIntent().getCategories();
    boolean isCategoryLauncher = categories != null && categories.contains(Intent.CATEGORY_LAUNCHER);
    return isActionMain && isCategoryLauncher;

【讨论】:

如果你有一个函数接受一个 Intent 而不是调用 getIntent,它就变成了一个可移植的 util 方法:)【参考方案7】:

我能想到的最简单的方法是在从您自己的活动中启动活动时传递一个标志。您还应该检查活动是否已创建或恢复,这可以通过在 onCreate 方法中设置一个布尔值来完成,然后在 onResume 中检查它。

以下是您可以使用的代码(未测试):

您要检查的活动(例如 MainActivity.class):

Boolean onCreateCalled = false;
Boolean calledFromAppActivities = false;

@Override
protected void onCreate(Bundle savedInstanceState) 

    super.onCreate(savedInstanceState);

    onCreateCalled = true;

    Bundle mainData = getIntent().getExtras();

    if (mainData != null) 
        if (getIntent().hasExtra("call_from_own_activity")) 
            calledFromAppActivities = true;
        
    

    .....



@Override
protected void onResume() 

    super.onResume();

    if (onCreateCalled && !calledFromAppActivities) 
        // The app was not called from any of our activities.
        // The activity was not resumed but was created.

        // Do Stuff
    

    // To stop it from running again when activity is resumed.
    onCreateCalled = false;

    ....


从其他活动调用 MainActivity 时,使用以下代码:

private void call_main () 
    Intent i = new Intent(getApplicationContext(), MainActivity.class);
    i.putExtra("call_from_own_activity", true);
    startActivity(i);

【讨论】:

以上是关于区分从主屏幕启动的 Activity 或从 App 启动的另一个 Activity的主要内容,如果未能解决你的问题,请参考以下文章

分享 App 应用快捷方式 [UIApplicationShortcutIconTypeShare]

从主屏幕快捷方式启动时,应用程序未安装错误

如何从 HomeScreen Widget 调用 Activity 中的函数

3.3 停止和重启 Activity

Activity的启动

与从 IDE 构建/运行相比,iOS 14 不允许 Flutter 应用程序(仍处于开发阶段)从主屏幕启动