因此,我正在尝试制作一个应用程序,以便当 SQL 数据库中的一行发生更改时,即使该应用程序当前未运行,用户也会收到通知。我很确定这是可能的,因为 Facebook 可以在应用程序未运行时发送移动通知,但我不知道该怎么做。
3 回答
您需要使用在后台运行的服务。您可以在服务中启动通知。不清楚您在说哪个“通知”?如果您在谈论Google Cloud Messaging 通知中的通知,那么您需要采用不同的方式。但是,您也将使用
扩展类的GCMIntentService 。Service
您想在when a row in a SQL database changes
. 该行是否在服务器端发生变化?我假设是的,因为首先你在谈论 Android 数据库,然后你会提到SQLite
而不是 SQL。其次,你举了 Facebook 的例子。所以,如果我的问题的答案是肯定的,那么使用 GCM 推送服务,您可以向用户发送推送消息。然后,当用户收到消息时,您可以显示带有适当数据的通知。在 的onReceive
方法中GCMIntentService
,您将收到 Intent 中的内容。您可以在那里提取消息并创建通知。请参阅此处了解更多信息。
您将需要注册一个内容观察者以获取更改通知。
要使用 ContentObserver,您必须采取两个步骤:
- 实现 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
您可以在android中使用服务
默认情况下,服务与应用程序在主线程中的同一进程中运行。
因此,您需要在服务中使用异步处理来在后台执行资源密集型任务。服务实现的常用模式是在服务中创建并运行一个新线程以在后台执行处理,然后在完成处理后终止服务。
每个服务都有一个特定的工作,即使你在不同的活动之间切换,它也会持续运行,或者完全切换到不同的应用程序。
要启动服务,请使用以下命令:
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;
}
}