Jek*_*eka 4 android android-manifest android-intent android-lifecycle android-activity
我有这个<intent-filter>,每次按下某个链接它打开我的应用程序但问题是它打开我的应用程序的新实例.反正有没有触发onResume()并只是恢复我的应用程序而不会丢失其状态或活动堆栈?
这是意图过滤器:
<intent-filter>
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="example.com" />
<data android:pathPattern="/.*" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
Run Code Online (Sandbox Code Playgroud)
感谢用户David Wasser在下面回答我找到答案:
所以我创建了在gmail/inbox应用程序之上启动的EntryActivity:
public class EntryActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.entry_activity);
Uri uriParams = getIntent().getData();
Log.e("EntryActivity", uriParams.getHost() );
Log.e("EntryActivity", uriParams.getQueryParameter("uid") + " " + uriParams.getQueryParameter("type") + " " + uriParams.getQueryParameter("token") );
Intent startCategory = new Intent(this, GotEmailActivity.class);
startCategory.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startCategory);
this.finish();
}
}
Run Code Online (Sandbox Code Playgroud)
然后当我的应用程序在GotEmailActivity打开时,我向用户发送电子邮件,其中包含打开应用程序的链接,而GotEmailActivity android:launchMode="singleTop"在AndroidManifest中具有属性,因此只打开了1个实例:
<!--
Important: notice android:launchMode="singleTop"
which seeks if an instance of this activity is already opened and
resumes already opened instance, if not it opens new instance.
-->
<activity
android:name=".presenters.register.email.GotEmailActivity"
android:label="@string/title_activity_got_email"
android:launchMode="singleTop"
android:theme="@android:style/Theme.Translucent.NoTitleBar" >
Run Code Online (Sandbox Code Playgroud)
现在发生的事情是,EntryActivity在Gmail应用程序的顶部打开但它关闭了inmediatle但首先启动已经打开的GotEmailActivity,因此属性launchMode Singletop会阻止此类活动的新实例.
您应该创建另一个Activity用作响应时应用程序的入口点<intent-filter>.像这样的东西:
你需要的只是一个什么都不做的简单活动.这是一个例子:
public class EntryActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Check to see if this Activity is the root activity
if (isTaskRoot()) {
// This Activity is the only Activity, so
// the app wasn't running. So start the app from the
// beginning (redirect to MainActivity)
Intent mainIntent = getIntent(); // Copy the Intent used to launch me
// Launch the real root Activity (launch Intent)
mainIntent.setClass(this, MainActivity.class);
// I'm done now, so finish()
startActivity(mainIntent);
finish();
} else {
// App was already running, so just finish, which will drop the user
// in to the activity that was at the top of the task stack
finish();
}
}
}
Run Code Online (Sandbox Code Playgroud)
把你的<intent-filter>活动,而不是你的"发射器"活动.确保在清单中,此活动的任务关联性与应用程序中其他活动的任务关联性相同(默认情况下,如果您未明确设置android:taskAffinity).
当<intent-filter>被触发,如果你的应用程序正在运行,那么EntryActivity将开始在上面的应用程序的任务,最上面的活动和任务将被带到前台.当EntryActivity完成后,它会简单地返回用户最上面的活动在您的应用程序(即:无论用户在哪里离开它,当它走进背景).
如果您的应用程序没有运行,EntryActivity则会识别此并从头开始启动您的应用程序,并将其传递Intent包含触发该操作的ACTION和DATA <intent-filter>.
应该管用.
| 归档时间: |
|
| 查看次数: |
2348 次 |
| 最近记录: |