【问题标题】:android handle activity launchingandroid句柄活动启动
【发布时间】:2015-11-20 11:52:35
【问题描述】:

我有以下情况: 当我启动我的应用程序时,会发生以下情况:

  • 我开始活动StartActivity
  • 如果我从来没有登录过(我知道它基于一些共同的偏好)启动 LoginActivity 并显示登录布局(用户名和密码)
  • 如果我已经登录,无论如何我都会启动 LoginActivity,但我会使用保存在共享首选项中的(加密的)数据,而无需再次向用户询问凭据。
  • 登录成功后,我启动活动StartActivity

现在在我的清单文件中,MainActivity 有以下 IntentFilter:

<intent-filter android:label="Conio" >
    <action android:name="android.intent.action.VIEW" />
    <data android:scheme="myprotocol" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
</intent-filter>

如果有一个大的“BUT”,一切都会很好: 只有当我的应用程序已经打开时,一切才能正常工作:我的应用程序被置于前面,调用 onCreate 方法并使用 getIntent.getData() 我可以访问启动我的应用程序的 URI。

大问题:

我需要的是:

  • 当我的应用程序尚未启动时,一切都应该从StartActivity 开始,按照前面的解释
    • 当我的应用程序运行时,行为必须是当前行为

为了做到这一点,我做了以下尝试: 我将该 IntentFilter 应用于新的 Activity ,在此 Activity 的 onCreate 方法中,我输入了以下代码

Intent intent = getPackageManager().getLaunchIntentForPackage("my.package.name");
if (intent != null) {
    intent.setData(intent.getData());
    intent.putExtra("test", "test");
    startActivity(intent);
    finish();
}

但这里发生的情况是,当应用程序未运行时,应用程序从 StartActivity 正确启动,但如果应用程序已经在运行,则 MainActivity 被置于前面,但我无法访问意图额外内容,实际上这段代码可以不工作

@Override
protected void onResume() {
    super.onResume();
//this code returns null
    String test=getIntent.getStringExtra("test");
}

我怎样才能让这一切发挥作用?

【问题讨论】:

    标签: android android-intent android-activity activity-lifecycle


    【解决方案1】:

    如果应用程序已经在运行,MainActivity 会被带到前面,但我无法访问 Intent 附加功能:

    要在 Activity 运行时获取 Intent 传递,请使用 LocalBroadcastManager 向正在运行的 Activity 发送新 Intent,而不是调用 startActivity 方法。

    没有LocalBroadcastManager在Intent中添加FLAG_ACTIVITY_SINGLE_TOP或者在启动MainActivity时在AndroidManifest.xml中添加android:launchMode="singleTask"

    intent.setData(intent.getData());
    intent.putExtra("test", "test");
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    startActivity(intent);
    

    并覆盖MainActivity 中的onNewIntent 方法:

    protected void onNewIntent(Intent intent) {
      super.onNewIntent(intent);
     //get data from intent
    }
    

    【讨论】:

      猜你喜欢
      • 2014-01-15
      • 1970-01-01
      • 1970-01-01
      • 2018-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-08
      • 1970-01-01
      相关资源
      最近更新 更多