API 레벨 16 (Jelly Bean)부터 다음을 사용하여 알림에 조치를 추가 할 수 있습니다.
builder.addAction(iconId, title, intent);
그러나 알림에 작업을 추가하고 작업을 누르면 알림이 닫히지 않습니다. 알림 자체를 클릭하면 다음과 같이 알림을 해제 할 수 있습니다.
notification.flags = Notification.FLAG_AUTO_CANCEL;
또는
builder.setAutoCancel(true);
그러나 분명히 이것은 알림과 관련된 작업과 관련이 없습니다.
힌트가 있습니까? 아니면 아직 API의 일부가 아닙니까? 나는 아무것도 찾지 못했습니다.
답변
통지 관리자에서 notify를 호출 할 때 ID를 제공했습니다. 이는 나중에 액세스 할 때 사용할 수있는 고유 ID입니다 (이는 통지 관리자에서 제공됨).
notify(int id, Notification notification)
취소하려면 다음으로 전화하십시오.
cancel(int id)
같은 ID로. 따라서 기본적으로 ID를 추적하거나 PendingIntent 내부의 Intent에 추가 한 번들에 ID를 넣어야합니까?
답변
Lollipop의 HUD (Heads Up Display) 알림을 사용할 때 이것이 문제인 것으로 나타났습니다. 설계 지침을 참조하십시오 . 구현할 완전한 (ish) 코드는 다음과 같습니다.
지금까지 ‘닫기’버튼을 사용하는 것이 덜 중요했지만 지금은 더 중요합니다.
알림 작성
int notificationId = new Random().nextInt(); // just use a counter in some util class...
PendingIntent dismissIntent = NotificationActivity.getDismissIntent(notificationId, context);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setPriority(NotificationCompat.PRIORITY_MAX) //HIGH, MAX, FULL_SCREEN and setDefaults(Notification.DEFAULT_ALL) will make it a Heads Up Display Style
.setDefaults(Notification.DEFAULT_ALL) // also requires VIBRATE permission
.setSmallIcon(R.drawable.ic_action_refresh) // Required!
.setContentTitle("Message from test")
.setContentText("message")
.setAutoCancel(true)
.addAction(R.drawable.ic_action_cancel, "Dismiss", dismissIntent)
.addAction(R.drawable.ic_action_boom, "Action!", someOtherPendingIntent);
// Gets an instance of the NotificationManager service
NotificationManager notifyMgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
// Builds the notification and issues it.
notifyMgr.notify(notificationId, builder.build());
NotificationActivity
public class NotificationActivity extends Activity {
public static final String NOTIFICATION_ID = "NOTIFICATION_ID";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manager.cancel(getIntent().getIntExtra(NOTIFICATION_ID, -1));
finish(); // since finish() is called in onCreate(), onDestroy() will be called immediately
}
public static PendingIntent getDismissIntent(int notificationId, Context context) {
Intent intent = new Intent(context, NotificationActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.putExtra(NOTIFICATION_ID, notificationId);
PendingIntent dismissIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
return dismissIntent;
}
}
AndroidManifest.xml (SystemUI가 백 스택에 집중하지 못하도록하는 데 필요한 속성)
<activity
android:name=".NotificationActivity"
android:taskAffinity=""
android:excludeFromRecents="true">
</activity>
답변
확장 알림에서 작업 버튼을 사용할 때 추가 코드를 작성해야하며 더 제한적이라는 것을 알았습니다.
사용자가 작업 버튼을 클릭하면 알림을 수동으로 취소해야합니다. 알림은 기본 작업에 대해서만 자동으로 취소됩니다.
또한 버튼에서 브로드 캐스트 수신기를 시작하면 알림 드로어가 닫히지 않습니다.
이러한 문제를 해결하기 위해 새로운 NotificationActivity를 만들었습니다. UI가없는이 중개 활동은 알림을 취소 한 다음 실제로 알림에서 시작하려는 활동을 시작합니다.
관련 게시물에 샘플 코드를 게시했습니다. Android 알림 작업을 클릭해도 알림 서랍이 닫히지 않습니다 .
답변
당신은 항상 할 수 에서 (에, 예를 들면 작용에 의해 호출되고 무엇이든 받는 사람 연결 활동의 당신이 제공 ).cancel()
Notification
onCreate()
PendingIntent
addAction()
답변
제 생각에는 a를 사용하는 BroadcastReceiver
것이 알림을 취소하는 더 확실한 방법입니다.
AndroidManifest.xml에서 :
<receiver
android:name=.NotificationCancelReceiver" >
<intent-filter android:priority="999" >
<action android:name="com.example.cancel" />
</intent-filter>
</receiver>
자바 파일에서 :
Intent cancel = new Intent("com.example.cancel");
PendingIntent cancelP = PendingIntent.getBroadcast(context, 0, cancel, PendingIntent.FLAG_CANCEL_CURRENT);
NotificationCompat.Action actions[] = new NotificationCompat.Action[1];
NotificationCancelReceiver
public class NotificationCancelReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//Cancel your ongoing Notification
};
}
답변
새로운 API에서는 TAG를 잊지 마십시오.
notify(String tag, int id, Notification notification)
그리고 이에 상응하여
cancel(String tag, int id)
대신에:
cancel(int id)
https://developer.android.com/reference/android/app/NotificationManager
답변
이 줄을 넣으십시오.
builder.setAutoCancel(true);
전체 코드는 다음과 같습니다.
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setSmallIcon(android.R.drawable.ic_dialog_alert);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.google.co.in/"));
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
builder.setContentIntent(pendingIntent);
builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.misti_ic));
builder.setContentTitle("Notifications Title");
builder.setContentText("Your notification content here.");
builder.setSubText("Tap to view the website.");
Toast.makeText(getApplicationContext(), "The notification has been created!!", Toast.LENGTH_LONG).show();
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
builder.setAutoCancel(true);
// Will display the notification in the notification bar
notificationManager.notify(1, builder.build());