14

从网络服务,我以日期和时间的形式获取数据,这意味着对于某个特定日期,我有一些插槽。下图给出了详细的解释。在此处输入图像描述

在每个日期,我都有一些时间安排。这里我想要的是在特定日期和时间显示通知。如果来自数据库的响应包含明天的日期,例如 2012 年 7 月 12 日上午 11:00。我需要在那个时候显示通知。

我对通知管理器和我正在使用的代码有一些想法是..

主.java

      NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
    Notification notification = new Notification(R.drawable.ic_action_search, "A New Message!", System.currentTimeMillis());

    Intent notificationIntent = new Intent(this, Main.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

    notification.setLatestEventInfo(Main.this, notificationTitle, notificationMessage, pendingIntent);
    notificationManager.notify(10001, notification);

但是在这里我也需要在应用程序关闭时收到通知。所以,任何人都可以帮我解决这个问题。

4

2 回答 2

17

将(已启动)添加Service到您的应用程序。即使用户退出了您的应用程序,该服务仍将在后台运行。

此外,您可以实现一个 BroadcastReceiver 来监听手机的 Intent 并让您的服务在手机启动时启动!

我的服务.java

public class MyService extends Service {

@Override
public int onStartCommand(Intent intent, int flags, int startId){
    // START YOUR TASKS
return super.onStartCommand(intent, flags, startId);
}

@Override
public void onDestroy() {
    // STOP YOUR TASKS
super.onDestroy();
}

@Override
public IBinder onBind(Intent intent){
    return null;
}

BootReceiver.java

public class BootReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
            Intent serviceIntent = new Intent("your.package.MyService");
            context.startService(serviceIntent);
            }
        }
    }
}

AndroidManifest.xml

// 在清单标签中

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

// 在您的应用程序标签中

<service android:name=".MyService">
    <intent-filter>
        <action android:name="your.package.MyService" />
    </intent-filter>
</service>

<receiver
    android:name=".BootReceiver"
    android:enabled="true"
    android:exported="true"
    android:label="BootReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

如果你想从一个活动开始你的服务,只需使用

private boolean isMyServiceRunning() {
         ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
         for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
             if (MyService.class.getName().equals(service.service.getClassName())) {
                 return true;
             }
         }
         return false;
     }

if (!isMyServiceRunning()){
     Intent serviceIntent = new Intent("your.package.MyService");
     context.startService(serviceIntent);
}
于 2012-12-06T11:15:47.990 回答
6

如果数据来自您的服务器,那么使用GCM可能是一个好方法。在这种情况下,服务器将能够唤醒/启动您的应用程序。

创建一个在您的案例中不断运行的服务是一个糟糕的解决方案。IMO 更好的方法是使用AlarmManager。警报管理器将在特定时间调用意图。(请注意,如果手机重新启动,您必须再次注册意图)。

于 2012-12-06T13:11:44.183 回答