Android服务在应用退出时无法发送通知

3
我创建了一个后台服务,它会检查我的Firebase数据库中的值是否发生了变化,并在有任何更改时发送通知。只要应用程序在运行,该服务就会通知值的更改。当我关闭应用程序时,就不再收到通知。我的onStartCommand包含一个新线程,其中包括Firebase值事件监听器。随着值的更改,我调用sendNotification方法。以下是完整的服务类代码: public class NotifyService extends Service {
Firebase mRef;

@Override
public IBinder onBind(Intent p1)
{
    // TODO: Implement this method
    return null;
}


@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
    Toast.makeText(this,"service started",Toast.LENGTH_LONG).show();
    Firebase.setAndroidContext(this);
    mRef= new Firebase(myURL);
    Runnable run = new Runnable(){
        @Override
        public void run(){
            mRef.child("politics").child("story1").child("title").addValueEventListener(new ValueEventListener(){
                    @Override
                    public void onDataChange(DataSnapshot p1)
                    {
                        // TODO: Implement this method
                        String data = (String)p1.getValue();
                        sendNotification(data);
                    } 

                    @Override
                    public void onCancelled(FirebaseError p1)
                    {
                        // TODO: Implement this method
                    }
                });

            mRef.child("sports").child("story1").child("title").addValueEventListener(new ValueEventListener(){
                    @Override
                    public void onDataChange(DataSnapshot p1)
                    {
                        // TODO: Implement this method
                        String data = (String)p1.getValue();
                        sendNotification(data);
                    } 

                    @Override
                    public void onCancelled(FirebaseError p1)
                    {
                        // TODO: Implement this method
                    }
                });

            mRef.child("science").child("story1").child("title").addValueEventListener(new ValueEventListener(){
                    @Override
                    public void onDataChange(DataSnapshot p1)
                    {
                        // TODO: Implement this method
                        String data = (String)p1.getValue();
                        sendNotification(data);
                    } 

                    @Override
                    public void onCancelled(FirebaseError p1)
                    {
                        // TODO: Implement this method
                    }
                });

            mRef.child("gossip").child("story1").child("title").addValueEventListener(new ValueEventListener(){
                    @Override
                    public void onDataChange(DataSnapshot p1)
                    {
                        // TODO: Implement this method
                        String data = (String)p1.getValue();
                        sendNotification(data);
                    } 

                    @Override
                    public void onCancelled(FirebaseError p1)
                    {
                        // TODO: Implement this method
                    }
                });
        }};
    Thread serviceThread = new Thread(run);
    serviceThread.start();
    return Service.START_STICKY;
}
@Override
public void onDestroy() 
{
    Toast.makeText(this, "activity destroyed", Toast.LENGTH_LONG).show();
}

public void sendNotification(String title){
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(NotifyService.this);
    mBuilder.setSmallIcon(R.drawable.nicon); 
    mBuilder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.nlicon));
    mBuilder.setAutoCancel(true);
    mBuilder.setContentTitle("New Story")   
    .setContentText(title);
    Intent resultIntent = new Intent(this, MainActivity.class);
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(NotifyService.this);
    stackBuilder.addNextIntent(resultIntent);
    PendingIntent resultPendingIntent = stackBuilder.getPendingIntent( 
        0,           
        PendingIntent.FLAG_UPDATE_CURRENT      
    );
    mBuilder.setContentIntent(resultPendingIntent);
    NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    mNotificationManager.notify((int)System.currentTimeMillis(), mBuilder.build());
}
}

我称之为

使用以下方式调用

Intent i = new Intent(this, NotifyService.class);
startService(i);

为什么应用程序退出后通知不能出现?我怀疑是通知方法有问题。


请提供您的服务类代码以及如何启动您的服务。 - kopikaokao
最好将线程移除并将代码粘贴到 onStartCommand 方法中。我认为问题出在线程的异步执行上。 - Krishna
有什么进展了吗?正如@qbix所说,检查一下你的代码中是否调用了stopService()。你的测试设备可能存在内存问题,请检查一下。一旦解决了,就在这里发布解决方案。 - Krishna
还没有成功。在我的项目中我从未调用过stopService()。我读到过android 4.4.2中有个bug,会在关闭应用程序时杀死服务,但是我可以在设置中看到我的服务正在运行。我尝试了整整一天,现在暂时放弃了这个想法。 - Hasaan Ahmed
还没有,我会检查一下 :) 是的,我们应该。 - Kairi San
显示剩余7条评论
1个回答

1
我的服务在设置中似乎正在运行,但实际上在应用程序被关闭后它被终止了。
为了保持你的服务运行,不要使用
startService(new Intent(this, MyService.class));

use this:

Intent serviceintent =new Intent(this, MyService.class);
    PendingIntent pendingintent =PendingIntent.getService(this,0, serviceintent,0);
    AlarmManager alarm =(AlarmManager)getSystemService(Context.ALARM_SERVICE);
    alarm.cancel(pendingintent);  
    alarm.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(),5000, pendingintent);

这会确保您的服务每隔5秒钟继续使用AlarmManager,因此无论发生什么情况,服务都将继续运行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接