2

IMAGE 我有代碼。這工作正常,並關閉通知。但是當我點擊「解除」按鈕時,它會打開應用程序並關閉對話框。這對我不是必需的。實際上,我想要的是,在不打開任何活動的情況下單擊「DISMISS」按鈕後關閉通知對話框。如何在點擊退出按鈕後關閉通知對話框,無需調用任何活動

MainActivity.java

public class MainActivity extends Activity{ 
    static int numMessages = 0; 
    Context context; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.notificationmain); 
     context = getApplicationContext(); 

     Button bcustomnotifyaction = (Button) findViewById(R.id.customnotificationaction); 

     bcustomnotifyaction.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       CustomNotificationAction(); 

      } 
     }); 

    } 

    @TargetApi(Build.VERSION_CODES.HONEYCOMB) 
    private void CustomNotificationAction() { 
     // Set Notification Title 
     String strtitle = "You Got New Notification."; 
     // Set Notification Text 
     String strtext ="Hi,How are You?"; 

     // Open NotificationView Class on Notification Click 
     Intent intent = new Intent(this, NotificationView.class); 
     // Send data to NotificationView Class 
     intent.putExtra("title", strtitle); 
     intent.putExtra("text", strtext); 
     // Open NotificationView.java Activity 
     PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 


     int notificationId = new Random().nextInt(); // just use a counter in some util class... 
     PendingIntent dismissIntent = NotificationActivity.getDismissIntent(notificationId, getApplicationContext()); 

     //Create Notification using NotificationCompat.Builder 
     NotificationCompat.Builder builder = new NotificationCompat.Builder(this) 
       // Set Icon 
       .setSmallIcon(R.drawable.logosmall) 
       // Set Ticker Message 
       .setTicker(strtitle) 
       // Set Title 
       .setContentTitle(strtitle) 
       // Set Text 
       .setContentText(strtext) 
       // Add an Action Button below Notification 
       .addAction(android.R.drawable.ic_menu_close_clear_cancel, "Dismiss", dismissIntent) 
       .addAction(android.R.drawable.ic_menu_info_details, "Info", pIntent) 
       // Set PendingIntent into Notification 
       .setContentIntent(pIntent) 
       // showing action button on notification 
       .setPriority(Notification.PRIORITY_MAX) 
       .setWhen(0) 

       /* Increase notification number every time a new notification arrives */ 
       .setNumber(++numMessages) 

       // Dismiss Notification 
       .setAutoCancel(true); 

     // Create Notification Manager 
     NotificationManager notificationmanager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
     // Build Notification with Notification Manager 
     notificationmanager.notify(0, builder.build()); 

    } 
} 

notificationmain.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context=".NotificationView" > 
<Button 
    android:id="@+id/customnotificationaction" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:text="@string/customnotificationaction" /> 
</RelativeLayout> 

NotificationView.java

public class NotificationView extends Activity { 
String title; 
String text; 
TextView txttitle; 
TextView txttext; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.notificationview); 

    // Create Notification Manager 
    NotificationManager notificationmanager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
    // Dismiss Notification 
    notificationmanager.cancel(0); 

    // Retrive the data from MainActivity.java 
    Intent i = getIntent(); 

    title = i.getStringExtra("title"); 
    text = i.getStringExtra("text"); 

    // Locate the TextView 
    txttitle = (TextView) findViewById(R.id.title); 
    txttext = (TextView) findViewById(R.id.text); 

    // Set the data into TextView 
    txttitle.setText(title); 
    txttext.setText(text); 
} 
} 

notificationview.xml

​​

NotificationActivity.java

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(0); 
    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_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    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; 
} 
} 

解決方案:

我通過廣播接收器得到了我的解決方案。

CODE我改變: 我在加入此代碼MainActivity.java CustomNotificationAction()。

//Create an Intent for the BroadcastReceiver 
     Intent buttonIntent = new Intent(context, ButtonReceiver.class); 
     //Create the PendingIntent 
     PendingIntent btPendingIntent = PendingIntent.getBroadcast(context, 0, buttonIntent,0); 

,改變了這條線從

.addAction(android.R.drawable.ic_menu_close_clear_cancel, "Dismiss", dismissIntent) 

.addAction(android.R.drawable.ic_menu_close_clear_cancel, "Dismiss", btPendingIntent) 

並添加一個Java文件

ButtonReceiver。java的

public class ButtonReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    Toast.makeText(context, "Notification Dialog Closed", 
      Toast.LENGTH_LONG).show(); 
    Log.d("Notification:","Notification Dialog Closed"); 
    NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
    manager.cancel(0); 

    PendingIntent resultPendingIntent = PendingIntent.getActivity(context, 0, new Intent(), 0); 
    NotificationCompat.Builder mb = new NotificationCompat.Builder(context); 
    mb.setContentIntent(resultPendingIntent); 
} 
} 

而且註冊廣播在Mainfest文件

<receiver android:name=".ButtonReceiver"/> 

我的問題解決了:)

您也可以從這個鏈接下載源代碼:

Download Source Code

回答

1

你可以用兩種服務和廣播接收器做到這一點,但我認爲廣播接收器將是一個更好的選擇來做到這一點。

int final MY_NOTIFICATION_ID = 1; 

     //Create an Intent for the BroadcastReceiver 
     Intent buttonIntent = new Intent(context, AutoDismissReceiver.class); 
     buttonIntent.putExtra("notificationId",MY_NOTIFICATION_ID); 

      //Create the PendingIntent 
     PendingIntent btPendingIntent = PendingIntent.getBroadcast(context, 0, buttonIntent,0); 

     //Pass this PendingIntent to addAction method of Intent Builder 
     NotificationCompat.Builder mb = new NotificationCompat.Builder(getBaseContext()); 
     ..... 
     ..... 
     mb.addAction(R.drawable.ic_dismiss, "Dismiss Action", btPendingIntent); 
     manager.notify(MY_NOTIFICATION_ID, mb.build()); 

和廣播接收器用於上述功能

public class AutoDismissReceiver extends BroadcastReceiver { 

      @Override 
      public void onReceive(Context context, Intent intent) { 
       int notificationId = intent.getIntExtra("notificationId", 0); 
       NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
       manager.cancel(notificationId); 
      } 
     } 

希望這有助於你。

+0

Thanx。有用 – lisha

相關問題