我正在使用Android L过渡ActivityOptions在意图中传递一个包.如何以相同的意图重现动画TaskStackBuilder?
这是我目前的单一工作方法Intent:
startActivity(myIntent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle());
Run Code Online (Sandbox Code Playgroud)
这是我的尝试TaskStackBuilder:
TaskStackBuilder builder = TaskStackBuilder.create(this);
builder.addNextIntentWithParentStack(myIntent);
builder.startActivities(ActivityOptions.makeSceneTransitionAnimation(this).toBundle());
Run Code Online (Sandbox Code Playgroud)
但动画创造了一种奇怪的效果,而不是"单一意图"版本.
我也尝试过:
builder.addNextIntent(myIntent);
Run Code Online (Sandbox Code Playgroud)
代替:
builder.addNextIntentWithParentStack(myIntent);
Run Code Online (Sandbox Code Playgroud) 为什么我们TaskStackBuilder在创建通知时使用?我没有得到它背后的逻辑.
有人可以解释一下.
public void showText(final String text){
Intent intent = new Intent (this, MainActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(MainActivity.class);
stackBuilder.addNextIntent(intent);
PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
Notification notification = new Notification.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(getString(R.string.app_name))
.setAutoCancel(true)
.setPriority(Notification.PRIORITY_MAX)
.setDefaults(Notification.DEFAULT_VIBRATE)
.setContentIntent(pendingIntent)
.setContentText(text)
.build();
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(NOTIFICACTION_ID, notification);
}
Run Code Online (Sandbox Code Playgroud) 在某些手机上尝试使用该startActivities()方法尝试启动活动时遇到问题TaskStackBuilder(特别是三星Galaxy S3 - Android 4.3,三星Galaxy S3 Neo - Android 4.4.2)
以下是使用的代码段:
TaskStackBuilder stackBuilder = TaskStackBuilder.create(ConfirmAddressActivity.this);
stackBuilder.addParentStack(AddressesActivity.class);
Intent intent = AddressesActivity.createStartingIntent(
ConfirmAddressActivity.this,
true, Collections.EMPTY_LIST
);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
stackBuilder.addNextIntent(intent);
stackBuilder.startActivities();
Run Code Online (Sandbox Code Playgroud)
有缺陷的行为是,在执行stackBuilder.startActivities()它之后打开一个白色屏幕并保持冻结而不打开AddressesActivity.这不是一种常规行为,有时会发生.
正常行为是,执行后stackBuilder.startActivities()打开白屏(0.5秒 - 1秒)然后打开AddressesActivity,同时正确构建该活动的完整后栈.这是许多设备/平台下的正确行为.(HTC M9 Android 6.0,三星S2 - Android 4.1.2,三星Galaxy S6 - Android 5.1.1,LG G4 - Android 5.1.1)
这是定义活动的android清单片段:
<activity
android:name=".activity.account.AccountActivity"
android:label="My account"
android:screenOrientation="portrait"
android:parentActivityName=".activity.DashboardActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.DashboardActivity" />
</activity>
<activity
android:name=".activity.addresses.AddressesActivity"
android:label="My addresses"
android:screenOrientation="portrait"
android:parentActivityName=".activity.account.AccountActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.account.AccountActivity" …Run Code Online (Sandbox Code Playgroud) 我做了一切,正如官方文档所写.但是当我向后导航时,MainActivity(父)不会打开.相反,应用程序关闭.
这是我的代码:
Intent resultIntent = new Intent(context, TestActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
stackBuilder.addParentStack(TestActivity.class);
stackBuilder.addNextIntent(resultIntent);
Run Code Online (Sandbox Code Playgroud)
清单如下:
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".TestActivity"
android:parentActivityName=".MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".Main2Activity" />
</activity>
Run Code Online (Sandbox Code Playgroud)
谢谢.
我在4.4.2和4.4.3设备上发生了崩溃(虽然我不确定这是一个API问题),但在某些情况下ParsePushBroadcastReceiver,以下代码会导致调用NullPointerException内部某处startActivities.
Intent intent = new Intent(context, SomeActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
TaskStackBuilder.create(context)
.addParentStack(SomeActivity.class)
.addNextIntent(intent)
.startActivities();
Run Code Online (Sandbox Code Playgroud)
我已经尝试过测试以查看上下文是否为null,但是,Intent实例化会抓住它.值得注意的是,此应用程序正在使用Parse Push.此崩溃的崩溃日志:
java.lang.RuntimeException: Unable to start receiver com.example.app.android.receiver.PushReceiver: java.lang.NullPointerException
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2567)
at android.app.ActivityThread.access$1800(ActivityThread.java:161)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1341)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5356)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
at dalvik.system.NativeStart.main(NativeStart.java)
Caused by: java.lang.NullPointerException
at android.os.Parcel.readException(Parcel.java:1471)
at android.os.Parcel.readException(Parcel.java:1419)
at android.app.ActivityManagerProxy.startActivities(ActivityManagerNative.java:4494)
at android.app.Instrumentation.execStartActivitiesAsUser(Instrumentation.java:1496)
at android.app.Instrumentation.execStartActivities(Instrumentation.java:1458)
at android.app.ContextImpl.startActivities(ContextImpl.java:1465)
at android.content.ContextWrapper.startActivities(ContextWrapper.java:350)
at android.content.ContextWrapper.startActivities(ContextWrapper.java:350)
at android.support.v4.content.ContextCompatJellybean.startActivities(ContextCompatJellybean.java:26)
at android.support.v4.content.ContextCompat.startActivities(ContextCompat.java:105)
at android.support.v4.app.TaskStackBuilder.startActivities(TaskStackBuilder.java:325)
at android.support.v4.app.TaskStackBuilder.startActivities(TaskStackBuilder.java:301)
at com.example.app.android.receiver.PushReceiver.routePush(PushReceiver.java:59) …Run Code Online (Sandbox Code Playgroud) 在我的例子中,我有一个活动A,它使用startActivityForResult调用活动B.
活动B是将数据返回到活动A的表单,因此数据可以存储在我的数据库中.
此外,我的应用程序启动通知,单击时启动活动B,当我尝试从活动B返回到活动A时出现问题,因为从未调用方法"onActivityResult".在创建TaskStackBuilder时,我无法模拟startActivityForResult():
Intent resultIntent = new Intent(this, activityB.class);
// This ensures that navigating backward from the Activity leads out of your application to the Home screen.
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
// Adds the back stack for the Intent (but not the Intent itself)
stackBuilder.addParentStack(activityB.class);
// Adds the Intent that starts the Activity to the top of the stack
stackBuilder.addNextIntent(resultIntent);
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(this)
.setContentIntent(resultPendingIntent);
Run Code Online (Sandbox Code Playgroud)
最后,我在manifest.xml中添加了活动B的父活动:
<activity
android:name=".activityB"
android:parentActivityName=".activityA"
android:windowSoftInputMode="stateHidden">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activityA"/>
</activity>
Run Code Online (Sandbox Code Playgroud) 当活动中发生某些事件时,我会向用户显示一条通知。创建通知时,如果系统清除了我的活动,我会使用 TaskStackBuilder 确保我有后退堆栈活动列表。我的代码看起来像这样:
...
TaskStackBuilder builder = TaskStackBuilder.create(sContext);
builder.addNextIntent(new Intent(context, ActivityA));
builder.addNextIntent(new Intent(context, ActivityB));
builder.addNextIntent(new Intent(context, ActivityC));
PendingIntent pendingIntent =
builder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT)
Notification.Builder builder = new Notification.Builder(context)
.setContentTitle(title))
.setContentText(notificationText)
.setSmallIcon(getNotificationIcon())
.setContentIntent(pendingIntent);
builder.build();
...
Run Code Online (Sandbox Code Playgroud)
因此,打开的活动将是最后添加的,即 ActivityC(我不希望重新创建它)。我找到的一个解决方案是:如何使通知恢复而不是重新创建活动? 据说我不应该使用TaskStackBuilder,但这不是我想要的。我想使用 TaskStackBuilder 从通知启动一个活动,而不是重新创建整个活动。
有什么解决方案/建议吗?
notifications android android-activity android-pendingintent taskstackbuilder
TaskStackBuilder 到底有什么问题,它在开始新活动时使用了这种丑陋的过渡。:
TaskStackBuilder taskStackBuilder = TaskStackBuilder.create(this)
.addParentStack(ActivityB.class)
.addNextIntent(new Intent(this, ActivityB.class));
taskStackBuilder.startActivities();
Run Code Online (Sandbox Code Playgroud)
这基本上是 google 的标准代码,但是如果您运行此代码,您将在转到 ActivityB 时看到一个超级丑陋的过渡。
我猜是因为它是一个新任务。但我不希望它看起来像这样,我有什么可以做的吗?
谢谢 !
我的应用程序接收推送并根据推送类型打开不同的活动。
我使用TaskStackBuilder待处理的 Intent 来在我的清单中结合创建一个合成后堆栈android:parentActivityName。
到目前为止,一切都很简单。当应用程序未启动时,一切按预期工作。但是,如果应用程序位于后台(任务正在运行),待处理的 Intent 还会使用清单中定义的父级启动我所需的活动,但会重置现有任务。问题是用户同时启动的其他活动也会被清除。 
所以想要实现的是:
我似乎无法让它与TaskStackBuilder.
我很乐意获得一些见解。
android android-intent android-notifications android-pendingintent taskstackbuilder
我收到一个通知,我想创建一个自定义的Back Stack,以便用户可以浏览它。但是到目前为止,单击通知会打开所需的活动,但是当我按下Back按钮时,它会完全退出该应用程序。
Intent resultIntent = new Intent(this, NotifViewActivity.class);
resultIntent.putExtra(StringHolder.NOTIFICATION_ID, notif.getId());
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(HomeActivity.class);
stackBuilder.addParentStack(NotifActivity.class);
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder notificationCompat = new NotificationCompat.Builder(context)
.setAutoCancel(true)
.setContentTitle(notif.getTitle())
.setSmallIcon(R.drawable.ic_launcher)
.setContentIntent(resultPendingIntent);
Run Code Online (Sandbox Code Playgroud)
清单文件
<activity
android:name=".NotifActivity"
android:parentActivityName=".HomeActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".HomeActivity" />
</activity>
<activity
android:name=".NotifViewActivity"
android:parentActivityName=".NotifActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".NotifActivity" />
</activity>
Run Code Online (Sandbox Code Playgroud)
我希望它的工作方式是,在单击通知时,将用户转到 NotifViewActivity,然后在按下后退按钮时,将用户转到NotifActivity;当再次按下后退按钮时,将用户 转到 HomeActivity。正在尝试创建,我该怎么做?
android android-intent android-notifications android-pendingintent taskstackbuilder