2011-08-02 22 views
0

このプラグインを実装しようとしていますPhonegap system notificationPhonegapシステム通知プラグインの実装

新しいRSSフィードのタイトルが表示されたら、新しいRSSフィードごとにシステム通知と更新されたカウンタを取得するように、JavaScriptの内部にnavigator.systemNotification.onBackground()navigator.systemNotification.updateNotification(contentText, tickerText, number)のメソッドを呼び出すことにします。

  1. は今第二供給がアップカウンタ来るとき、私は新しいフィードが存在する場合、システムの通知を取得したが 通知(アイコン/画像)に1を示し、まだそれが増加されていません。
  2. 通知方法がバックグラウンドでも実行されます。 カウンタが更新されていないため、テストできません。
  3. クリア ボタンをクリックすると、システム通知をクリアすることができます。ユーザーが システム通知をクリックしたときにそれをクリアすることはできますか?

私は自分のJavascriptで何か間違っていると思います。

var oldEntry=""; 
    document.addEventListener("deviceready", onDeviceReady, false); 

    // PhoneGap is ready 
    // 
    function onDeviceReady() { 
     // Empty 
    } 

    // Show a custom alert 
    // 
    function sendRequest(){ 
     getRss("http://rss.cnn.com/rss/cnn_latest.rss.xml");  
     setTimeout('showAlert(newEntry.title)',4000); 
    } 

    function showAlert(data) { 
     var st = randomString(); 
     if(oldEntry==""){ 
     oldEntry = data; 

      navigator.systemNotification.onBackground(); 
      navigator.systemNotification.updateNotification(data, 'test' , '1');  
     } else { 
      if(oldEntry!=data){ 
       navigator.notification.alert(
       data,    // message 
        'New Rss Entry', // title 
        'New Rss Entry'); 

       oldEntry = data;   
      } 
     } 

     setTimeout('sendRequest()',7000); 
    } 

    function randomString() { 
     var chars = "ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz"; 
     var string_length = 8; 
     var randomstring = ''; 
     for (var i=0; i<string_length; i++) { 
      var rnum = Math.floor(Math.random() * chars.length); 
      randomstring += chars.substring(rnum,rnum+1); 
     } 
     return randomstring; 
    } 

    sendRequest(); 

これはsystemnotification.jsです:

function SystemNotification() { 
} 

SystemNotification.prototype.notificationEnabled = false; 

SystemNotification.prototype.newCount = 0; //to keep track of multiple notifications events 

SystemNotification.prototype.enableNotification = function() { 
    this.notificationEnabled = true; 
}; 

SystemNotification.prototype.disableNotification = function() { 
    this.notificationEnabled = false; 
}; 

SystemNotification.prototype.onBackground = function() { 
    this.enableNotification(); 
}; 

SystemNotification.prototype.onForeground = function() { 
    this.disableNotification(); 
}; 

SystemNotification.prototype.createStatusBarNotification = function (contentTitle, contentText, tickerText) { 
    PhoneGap.exec(null, null, "systemNotification", "createStatusBarNotification", [contentTitle, contentText, tickerText]); 
}; 

SystemNotification.prototype.updateNotification = function (contentText, tickerText, number) { 
    this.newCount++; 
    var contentTitle = "my title"; 
    if (this.newCount === 1) { 
     this.createStatusBarNotification(contentTitle, contentText, tickerText); 
    } else { 
     PhoneGap.exec(null, null, "systemNotification", "updateNotification", [contentTitle, contentText, this.newCount]); 
     this.showTickerText(tickerText); //optional 
    } 
}; 

SystemNotification.prototype.cancelNotification = function (contentText) { 
    this.newCount--; 
    if (this.newCount === 0) { 
     PhoneGap.exec(null, null, "systemNotification", "cancelNotification", []); 
    } 
    else { 
    //updating the notification 
     var contentTitle = "my title"; 
     PhoneGap.exec(null, null, "systemNotification", "updateNotification", [contentTitle, contentText, this.newCount]); 
    } 
}; 

SystemNotification.prototype.showTickerText = function (tickerText) { 
    PhoneGap.exec(null, null, "systemNotification", "showTickerText", [tickerText]); 
}; 

SystemNotification.prototype.touch = function() { 
    PhoneGap.exec(null, null, "systemNotification", "touch", []); 
}; 

PhoneGap.addConstructor(function() { 
    if (typeof(navigator.systemNotification) == "undefined") { 
     navigator.systemNotification = new SystemNotification(); 
     navigator.systemNotification.touch(); //this ensures that the plugin is added when phonegap kicks off 
    } 
}); 

これはsystemnotification.javaです:

public class SystemNotification extends Plugin { 

    final int notif_ID = 1234; 
    NotificationManager notificationManager; 
    Notification note; 
    PendingIntent contentIntent; 

    @Override 
    public PluginResult execute(String action, JSONArray args, String callbackId) 
    { 
     PluginResult.Status status = PluginResult.Status.OK; 
     String result = ""; 

     try { 
      if (action.equals("createStatusBarNotification")) { 
       this.createStatusBarNotification(args.getString(0), args.getString(1), args.getString(2)); 
      } 
      else if (action.equals("updateNotification")) { 
       this.updateNotification(args.getString(0), args.getString(1), args.getInt(2)); 
      } 
      else if (action.equals("cancelNotification")) { 
       this.cancelNotification(); 
      } 
      else if (action.equals("showTickerText")) { 
       this.showTickerText(args.getString(0)); 
      } 
      return new PluginResult(status, result); 
     } catch(JSONException e) { 
      return new PluginResult(PluginResult.Status.JSON_EXCEPTION); 
     } 
    } 

    private void updateNotification(String contentTitle, String contentText, int number) 
    { 
     note.setLatestEventInfo(this.ctx, contentTitle, contentText, contentIntent); 
     note.number = number; 
     notificationManager.notify(notif_ID,note); 
    } 

    private void createStatusBarNotification(String contentTitle, String contentText, String tickerText) 
    { 
     notificationManager = (NotificationManager) this.ctx.getSystemService(Context.NOTIFICATION_SERVICE); 
     note = new Notification(R.drawable.rss, tickerText, System.currentTimeMillis()); 
    //change the icon 

    Intent notificationIntent = new Intent(this.ctx, Yfs.class); 
     notificationIntent.setAction(Intent.ACTION_MAIN); 
     notificationIntent = notificationIntent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); 
     contentIntent = PendingIntent.getActivity(this.ctx, 0, notificationIntent, 0); 

     note.setLatestEventInfo(this.ctx, contentTitle, contentText, contentIntent); 

     note.number = 1; //Just created notification so number=1. Remove this line if you dont want numbers 

     notificationManager.notify(notif_ID,note); 
    } 

    private void cancelNotification() 
    { 
     notificationManager.cancel(notif_ID); 
    } 

    private void showTickerText(String tickerText) 
    { 
     note.tickerText = tickerText; 
     notificationManager.notify(notif_ID,note); 
    } 

    public void onPause() 
    { 
     super.webView.loadUrl("javascript:navigator.systemNotification.onBackground();"); 
    } 

    public void onResume() 
    { 
     super.webView.loadUrl("javascript:navigator.systemNotification.onForeground();"); 
    } 
} 

答えて

1

これが私の答えである通知をクリアします。 Android上

、あなたは右

通知するための

note.flags = Notification.FLAG_AUTO_CANCEL;

1

下の行を追加します。あなたはこの

note = new Notification(R.drawable.rss, tickerText, System.currentTimeMillis());

を持っているフラグAUTO_CANCEL

を設定する必要がありますあなたのJavaScriptはバックグラウンドで実行できるはずです。この1つだけのための方法onPause()を置き換えるSystemNotification.javaファイルでPhoneGap discussion forum

2

で説明したソリューション:

public void onPause() 
{ 
    super.webView.loadUrl("javascript:try{PhoneGap.onResume.fire();}catch(e){};"); 
    super.webView.resumeTimers(); 
} 
関連する問題