Ast*_*ter 47 android android-intent android-notifications
我正在使用NotificationCompat
库向系统栏添加通知.此通知有两个操作按钮.此外,AutoCancel()
Notification上的属性设置为true.
单击操作按钮,系统配置为启动IntentService
调用NotificationManager.cancel(NOTIFICATION_ID)
,然后在新任务中启动活动.
问题是虽然此调用会从托盘中删除通知,但它不会折叠抽屉.被叫活动在抽屉后面绘制.
除了取消通知之外,有人可以详细说明关闭抽奖需要什么特殊代码吗?
谢谢.
And*_* Id 48
如果您的操作采用广播或服务的形式,但您打算让通知抽屉崩溃,则应从onReceive 广播android.intent.action.CLOSE_SYSTEM_DIALOGS.这将手动关闭抽屉.
我发现当您在扩展通知中使用操作按钮时,您必须编写额外的代码并且您受到更多限制.
在使用扩展通知之前,我的文件下载通知中的默认操作是在文件上启动VIEW活动.VIEW意图由Chooser意图包裹.我无法直接从通知中使用Chooser intent的挂起意图,因为如果没有活动可以查看文件类型,Chooser会崩溃.所以我有一个可以启动Chooser意图的BroadcastReceiver.
通过扩展通知,我决定更改文件下载通知,因此默认操作是显示文件详细信息活动,以及"查看和发送"操作按钮.如user2536953所述,从通知开始广播接收器不会关闭通知抽屉.根据他的信息,活动将关闭抽屉,我将我的广播接收器更改为没有任何UI的NotificationActivity.
如本文中所示,如何在单击操作后关闭Android通知,另一个问题是您必须在用户单击操作按钮时手动取消通知.通知仅在默认操作时自动取消.我还在NotificationActivity中添加了代码来处理这个问题.
使用视图和发送按钮构建扩展通知:
NotificationCompat.Builder builder = new NotificationCompat.Builder(m_context).setAutoCancel(true);
final PendingIntent contentIntent = DownloadedFileIntentUtils.buildPendingItemDetailIntent(m_context, item);
builder.setContentIntent(contentIntent);
PendingIntent viewIntent = DownloadedFileIntentUtils.buildNotificationActionIntent(m_context, Intent.ACTION_VIEW,
m_context.getString(R.string.action_open), uri, MimeTypeUtil.getMimeType(item), id);
builder.addAction(R.drawable.actionbar_open_with, m_context.getString(R.string.action_open), viewIntent);
PendingIntent sendIntent = DownloadedFileIntentUtils.buildNotificationActionIntent(m_context, Intent.ACTION_SEND,
m_context.getString(R.string.action_send), uri, MimeTypeUtil.getMimeType(item), id);
builder.addAction(R.drawable.actionbar_share, m_context.getString(R.string.action_send), sendIntent);
builder.setTicker(title)
.setContentTitle(title)
.setContentText(text)
.setSmallIcon(R.drawable.notification_download);
.setStyle(new NotificationCompat.BigTextStyle().bigText(text));
getNotificationManager().notify(id, builder.build());
Run Code Online (Sandbox Code Playgroud)
构建从通知操作按钮启动活动的意图:
public static PendingIntent buildNotificationActionIntent(Context context, String action, String actionTitle, Uri uri,
String mimeType, int notificationId) {
// Build the file action intent (e.g. VIEW or SEND) that we eventually want to start.
final Intent fileIntent = buildFileActionIntent(action, actionTitle, uri, mimeType);
// Build the intent to start the NotificationActivity.
final Intent notificationIntent = new Intent(context, NotificationActivity.class);
// This flag must be set on activities started from a notification.
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// Pass the file action and notification id to the NotificationActivity.
notificationIntent.putExtra(Intent.EXTRA_INTENT, fileIntent);
notificationIntent.putExtra(IIntentCode.INTENT_EXTRA_NOTIFICATION_ID, notificationId);
// Return a pending intent to pass to the notification manager.
return PendingIntent.getActivity(context, s_intentCode.getAndIncrement(), notificationIntent, PendingIntent.FLAG_ONE_SHOT);
}
public static Intent buildFileActionIntent(String action, String actionTitle,
Uri uri, String mimeType) {
Intent intent = new Intent(action);
intent.addCategory(Intent.CATEGORY_DEFAULT);
if (action.equals(Intent.ACTION_SEND)) {
intent.putExtra(Intent.EXTRA_STREAM, uri);
intent.setType(mimeType);
} else {
intent.setDataAndType(uri, mimeType);
}
intent.putExtra(Intent.EXTRA_TITLE, actionTitle);
// Grant read permission on the file to other apps without declared permission.
int flags = Intent.FLAG_GRANT_READ_URI_PERMISSION;
intent.setFlags(flags);
return intent;
}
Run Code Online (Sandbox Code Playgroud)
没有任何UI的通知活动:
public class NotificationActivity extends Activity {
private final static Logger s_logger = LogUtil.getLogger(NotificationActivity.class);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
// Cancel the notification that initiated this activity.
// This is required when using the action buttons in expanded notifications.
// While the default action automatically closes the notification, the
// actions initiated by buttons do not.
int notificationId = intent.getIntExtra(IIntentCode.INTENT_EXTRA_NOTIFICATION_ID, -1);
if (notificationId != -1) {
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
manager.cancel(notificationId);
}
// If there is an activity to handle the action, start the file action.
if (DownloadedFileIntentUtils.verifyActivityIsAvailable(this, fileActionIntent, false)) {
fileActionIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
DownloadedFileIntentUtils.startFileActionActivity(this, fileActionIntent);
}
// Finish activity.
finish();
}
public static void startFileActionActivity(Context context, Intent fileActionIntent) {
// Start chooser intent.
Intent chooser = Intent.createChooser(fileActionIntent, fileActionIntent.getStringExtra(Intent.EXTRA_TITLE));
// Copy the flags from fileActionIntent to chooser intent.
// FileActionExecutor must set FLAG_ACTIVITY_NEW_TASK on the intent passed to startActivity
// because the flag is required when starting an activity from a context that is not an activity.
chooser.addFlags(fileActionIntent.getFlags());
context.startActivity(chooser);
}
Run Code Online (Sandbox Code Playgroud)
不要忘记将NotificationActivity添加到AndroidManifest.xml.
小智 0
每当您单击通知并启动活动或广播时,Android 系统都会为您折叠通知抽屉。我认为没有任何编程方式可以通过您的代码关闭通知抽屉。我建议您检查传递给通知生成器的意图,并确保为它们提供正确的参考意图。我认为 Android 通知管理器中的某些内容由于您提供的意图而被阻止。到目前为止,我还没有看到通知触发操作后通知抽屉保持打开状态。只是想知道您的目标活动是否具有前一个活动可见的半透明区域,如果是,那么我建议您使背景完全不透明(没有透明/半透明区域)。可能是因为这阻止了 android home 启动器完成停止序列,从而不允许启动器为您关闭通知抽屉。希望我能够帮助你。一切顺利。
归档时间: |
|
查看次数: |
14655 次 |
最近记录: |