Android 应用程序开发人员能否从通知启动我的活动(已导出)?
我有一个活动在清单中为hasAndroid 应用程序开发人员能否从通知启动我的活动(已导出)?,android,android-intent,android-notifications,Android,Android Intent,Android Notifications,我有一个活动在清单中为hasexported=true。我目前正在进行一些逻辑分析,以确定该活动是从我的应用程序的活动开始的,还是从另一个应用程序开始的 让我担心的是,如果我在应用程序中设置了一个通知,则由通知单击启动的活动属于我的“从外部启动”逻辑。我遇到了一个问题,因为即使是从“外部”启动的,它也会被放入我当前的任务堆栈中。我可以用一些意图标志(比如clear_top)来解决这个问题,但我不想让另一个应用程序创建通知来启动我的活动,因为它将被附加到我当前的任务堆栈上 通知生成器文档说: 虽然
exported=true
。我目前正在进行一些逻辑分析,以确定该活动是从我的应用程序的活动开始的,还是从另一个应用程序开始的
让我担心的是,如果我在应用程序中设置了一个通知,则由通知单击启动的活动属于我的“从外部启动”逻辑。我遇到了一个问题,因为即使是从“外部”启动的,它也会被放入我当前的任务堆栈中。我可以用一些意图标志(比如clear_top)来解决这个问题,但我不想让另一个应用程序创建通知来启动我的活动,因为它将被附加到我当前的任务堆栈上
通知生成器文档说:
虽然操作是可选的,但至少应向添加一个操作
你的通知。一个操作直接从
通知应用程序中的活动,它们可以在其中查看
在导致通知的事件中,或做进一步的工作
主要的一点是一个操作直接从
通知**应用程序**中的活动
附加问题:另一个应用程序能否启动我的活动并将该活动放入我的应用程序当前任务堆栈中
编辑:我知道测试东西最简单的方法就是尝试一下,所以我创建了自己的示例应用程序来尝试测试一下。但它似乎不起作用。它不会启动活动(这很好),但不会崩溃,而且似乎什么都不做,所以我认为它可能不正确
public class MainActivity extends Activity {
Intent intent;
PendingIntent resultPendingIntent;
Intent resultIntent;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.layout);
LinearLayout layout = (LinearLayout) findViewById(R.id.rootView);
Button button1 = new Button(this);
button1.setText("Send notification");
intent = new Intent();
resultIntent = new Intent();
intent.setComponent(new ComponentName("com.myapp.tester",
"com.myapp.tester.MyMainActivity"));
final PendingIntent resultPendingIntent =
PendingIntent.getActivity(
this,
0,
resultIntent,
PendingIntent.FLAG_UPDATE_CURRENT
);
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(MainActivity.this)
.setSmallIcon(R.drawable.ic_launcher)
.setContentTitle("My notification")
.setContentText("Hello World!");
// Because clicking the notification opens a new ("special") activity, there's
// no need to create an artificial back stack.
mBuilder.setContentIntent(resultPendingIntent);
int mNotificationId = 001;
// Gets an instance of the NotificationManager service
NotificationManager mNotifyMgr =
(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
// Builds the notification and issues it.
mNotifyMgr.notify(mNotificationId, mBuilder.build());
}
});
layout.addView(button1);
}
}
我们就拿个吊坠吧。由于PendingIntent可以围绕任何目的构建,因此我认为您应该能够创建一个调用另一个应用程序的PendingIntent。更糟糕的情况是,您创建了一个调用您的应用程序的应用程序,它会立即调用另一个应用程序。但我认为这没有必要,我认为你可以直接说出你想要的意图。没错!通知包含挂起内容,这可能是我的应用程序的意图。如果您能看看我的样品,我将不胜感激。我不确定为什么我的测试用例没有启动我的活动。您有两个不同的意图对象。我想你可能把他们搞混了。您正在将Resultent添加到挂起的意图中,但没有在Resultent上设置任何内容(您将其设置为意图)。哦,伙计。好吧,我想我已经看这个太久了。谢谢我希望情况不会是这样。当我的测试代码工作时,它会弄乱我的任务堆栈。关于如何不让外部应用程序在我的当前任务堆栈中创建新活动,有什么想法吗?这是intent活动标志之一。我认为FLAG_ACTIVITY_NEW_TASK?是的,但如果另一个开发人员出现,他将不知道该怎么做。这基本上是我的问题。关于奖金问题有什么帮助吗?“另一个应用程序是否可以启动我的活动并将该活动放入我的应用程序当前任务堆栈中?”如果我记得,PendingEvent具有转发自定义权限的功能,您可以对此进行探索。或者,您可以将自己动手一次性授权令牌放入一个in-intent extra中,并在收到时进行检查。