android句柄活动启动

时间:2015-11-20 11:52:36

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

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

  • 我开始活动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”: 一切只有在我的应用程序已经打开时才有效:我的app被带到前面,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");
}

如何让所有这些工作?

1 个答案:

答案 0 :(得分:0)

如果应用程序已在运行,MainActivity会被带到前面,但我无法访问意图附加内容:

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

启动LocalBroadcastManager时,在{1}}中没有FLAG_ACTIVITY_SINGLE_TOP添加android:launchMode="singleTask"或在AndroidManifest.xml中添加MainActivity

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

并覆盖onNewIntent中的MainActivity方法:

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