2015-05-08 117 views
0

我有一个以广播接收器开始的服务。通知服务Android

在此服务中,我想每分钟发送一次通知。 问题是:我只收到一条消息。

问题:我需要做什么,每分钟收到消息?

这是我的代码。

的Manifest.xml

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />  
<application> 
    <receiver android:name="com.polifrete.polifreteFunctions.MyReceiver" > 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      <action android:name="android.intent.action.QUICKBOOT_POWERON"/> 
     </intent-filter> 
    </receiver> 
    <service 
     android:name="com.polifrete.polifreteFunctions.NotificationService" 
     android:launchMode="singleTask" > 
    </service> 
</application> 

SERVICE

package com.polifrete.polifreteFunctions; 

import com.polifrete.polifreteandroid.MainActivity; 

import android.app.NotificationManager; 
import android.app.PendingIntent; 
import android.app.Service; 
import android.content.Intent; 
import android.os.IBinder; 
import android.support.v4.app.NotificationCompat; 
import android.util.Log; 

public class NotificationService extends Service { 

public static final int time = 60 * 1000; 

@Override 
public IBinder onBind(Intent arg0) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public void onCreate() { 
    Log.i("Script", "Passou SERVICE CREATE"); 
    super.onCreate(); 
} 

@Override 
public void onStart(Intent intent, int startId) { 
    Log.i("Script", "Passou SERVICE START"); 
} 

@Override 
public void onDestroy() { 
    Log.i("Script", "Passou SERVICE DESTROY"); 
    super.onDestroy(); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    Log.i("Script", "Passou SERVICE COMMAND"); 
    final Thread t = new Thread() { 
     @Override 
     public void run() { 
      try { 
       Thread.sleep(time); 
       showNotification(); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    }; 
    t.start(); 
    return Service.START_STICKY; 
} 

public void showNotification() { 

    Intent intent = new Intent(this, MainActivity.class); 
    PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, 
      PendingIntent.FLAG_UPDATE_CURRENT); 

    NotificationCompat.Builder n = new NotificationCompat.Builder(this) 
      .setContentTitle("Test Notification") 
      .setContentText("Test Notification.") 
      .setSmallIcon(
        com.polifrete.polifreteandroid.R.drawable.ic_actionbar) 
      .setContentIntent(pIntent); 

    NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 

    notificationManager.notify(0, n.build()); 

} 

}

BROADCAST

package com.polifrete.polifreteFunctions; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 

public class MyReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    // TODO Auto-generated method stub 
    Log.i("Script", "Passou RECEIVER"); 
    Intent i = new Intent(context, NotificationService.class); 
    context.startService(i); 
} 

}

+0

我不知道为什么,但有时它传递给接收器,有时不...可以有人帮助我吗? –

回答

0

您在notificationManager.notify(0, n.build());行中设置的通知ID = 0仍然相同。设置任意随机值((int)(Math.random()*10000);)。相同的id导致用相同的id覆盖现有的通知。 你也应该设置为低于线不同PendingIntent小号

intent.setAction(Long.toString(System.currentTimeMillis())); 
... 
notificationManager.notify((int)(Math.random()*10000), n.build()); 

你也应该使用TimerCountDownTimer,而不是睡觉Thread

0

如果使用相同的,你应该改变这一个

while(true){ 

     try { 
      Thread.sleep(time); 
      showNotification(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

通知ID,那么下一个通知将会替换之前的通知,如果您希望它们分开,则只需使用其他ID进行下一次通知。

+0

我改变了区块,并为我的通知添加了不同的ID,但仍然只出现一个通知... –

+0

@Felipe A. 您使用随机生成器来通知ID吗? –

+0

尝试在notif中显示不同的数据,因为我现在看到您显示相同的硬编码字符串。尝试使用随机生成器将其显示为通知文本。那么你会知道它是否真的相同notif或只更新前一个 –