所以我正在尝试创建一个应用程序,以便当SQL数据库中的一行发生更改时,即使应用程序当前未运行,用户也会收到通知。我很确定这是可能的,因为Facebook可以在应用程序未运行时发送移动通知,但我不确定如何解决这个问题。
答案 0 :(得分:2)
您需要使用在后台运行的Service。在服务中,您可以开始通知。目前尚不清楚你在谈论哪种“通知”?如果您在Google Cloud Messaging notification中谈论通知,那么您需要采用不同的方式。但是,那么你也会使用
GCMIntentService扩展Service
类。
您想在when a row in a SQL database changes
时发送通知。该行是否在服务器端发生变化?我假设是的,因为首先你在谈论Android数据库,然后你会提到SQLite
而不是SQL。其次你举了Facebook的例子。因此,如果我的问题的答案是肯定的,那么使用GCM推送服务,您可以向用户发送推送消息。然后,当用户收到消息时,您可以显示包含正确数据的通知。在onReceive
的{{1}}方法中,您将收到意图中的内容。在那里,您可以提取消息并创建通知。有关详情,请参阅here。
答案 1 :(得分:2)
您需要注册内容观察员以获得有关更改的通知。
要使用ContentObserver,您必须采取两个步骤:
-
class DbObserver extends ContentObserver {
public DbObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
this.onChange(selfChange, null);
// start the notification
}
}
注册您的内容观察者以收听更改:
getContentResolver().
registerContentObserver(
SOME_URI,
true,
yourObserver);
现在可以在更新数据库后调用notifyChange
。
notifyChange(Uri uri, ContentObserver observer)
使用内容观察者的一个简单示例是https://gist.github.com/JBirdVegas/3874450
答案 2 :(得分:1)
您可以在android
中使用Service默认情况下,服务在主线程中与应用程序在同一进程中运行。
因此,您需要在服务中使用异步处理来在后台执行资源密集型任务。服务实现的常用模式是在服务中创建并运行新的Thread以在后台执行处理,然后在完成处理后终止服务。
每个服务都有一个特定的工作,即使您在不同的活动之间切换,也可以在不同的应用程序之间切换,它将持续运行。
要启动服务,请使用以下命令:
Intent i= new Intent(context, ServiceClass.class);
i.putExtra("KEY1", "Value to be used by the service");
context.startService(i);
服务类的一个简单示例:
public class ServiceClass extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return Service.START_NOT_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}