【问题标题】:How is it possible for the user to receive notifications even when the app is not running即使应用程序未运行,用户如何才能收到通知
【发布时间】:2014-02-08 23:10:51
【问题描述】:

所以我正在尝试制作一个应用程序,以便当 SQL 数据库中的一行发生更改时,即使该应用程序当前未运行,用户也会收到通知。我很确定这是可能的,因为 Facebook 可以在应用未运行时发送移动通知,但我不知道该怎么做。

【问题讨论】:

  • 您是在询问手机中的 SQLLite 数据库还是服务器上的数据库?将在哪些数据库中进行更改?

标签: android database notifications


【解决方案1】:

您需要使用在后台运行的Service。您可以在服务中启动通知。不清楚您在说哪个“通知”?如果您在谈论Google Cloud Messaging notification 中的通知,那么您需要采用不同的方式。但是,那么你也会使用 GCMIntentService 扩展 Service 类。

您想在when a row in a SQL database changes 时发送通知。该行是否在服务器端发生变化?我假设是的,因为首先您在谈论 Android 数据库,然后您会提到 SQLite 而不是 SQL。其次,你举了 Facebook 的例子。所以,如果我的问题的答案是肯定的,那么使用 GCM 推送服务,您可以向用户发送推送消息。然后,当用户收到消息时,您可以显示带有适当数据的通知。在GCMIntentServiceonReceive 方法中,您将收到Intent 中的内容。您可以在那里提取消息并创建通知。请参阅here 了解更多信息。

【讨论】:

  • 我试图在服务器上的数据库行发生更改时向用户发送通知,因此我需要使用 GCM 推送服务。抱歉,我对此很陌生,但是如何使用 GCM 推送服务来发送数据,我可以直接监听数据库更改还是必须使用 php 文件来这样做?
  • @user2619645 您需要同时拥有这两个服务器组件,该组件将与 GCM 谷歌服务器联系,后者会将推送消息发送到用户的应用程序。阅读developer.android.com/google/gcm/server.html 了解如何实现服务器端。然后需要有客户端,即您的应用程序端。它将通过GCM接收服务器发送的reitration ID和数据。阅读developer.android.com/google/gcm/client.html 来实现它。两个链接都有示例。希望对您有所帮助。
  • 那么是否可以让 php 文件向 gcm google 服务器发送数据,以便应用接收数据?
  • 是的。用任何服务器端语言都可以。
【解决方案2】:

您需要注册一个内容观察者才能收到更改通知。

要使用 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

【讨论】:

    【解决方案3】:

    你可以在android中使用Service

    默认情况下,服务与应用程序在主线程中的同一进程中运行。

    因此您需要在服务中使用异步处理来在后台执行资源密集型任务。服务实现的一种常用模式是在服务中创建并运行一个新线程以在后台执行处理,然后在完成处理后终止服务。

    每个服务都有一个特定的工作,即使你在不同的活动之间切换,它也会持续运行,或者完全切换到不同的应用程序。

    要启动服务,请使用以下命令:

    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;
          }
        } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      • 2018-06-07
      • 1970-01-01
      • 2015-08-25
      • 1970-01-01
      相关资源
      最近更新 更多