Android:状态栏使用服务的通知

时间:2012-10-12 10:55:34

标签: android android-pendingintent

在我的一项活动 Activity_A 中,我以这种方式覆盖 onResume()

protected void onResume() {

super.onResume();
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
Intent i = new Intent(this, NotificationsService.class);
PendingIntent pi = PendingIntent.getService(this, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
am.cancel(pi);
am.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 20000, 20000, pi);
}

在20秒后开始通知,然后每20秒重复一次。

但这不起作用,即使在5-10分钟后我也没有得到任何通知。我错过了什么。

NotificationService类:

public class NotificationsService extends Service {

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        handleIntent(intent);
        return START_NOT_STICKY;
    }

    private NotificationManager nm;
    private WakeLock mWakeLock;

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mWakeLock.release();
    }

    private void showNotification() {

        nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        Notification notification = new Notification(R.drawable.icon,
                "This is a Notification", System.currentTimeMillis());
        notification.flags = Notification.FLAG_AUTO_CANCEL;
        Intent i = new Intent(this, Activity_B.class);
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0, i,
                PendingIntent.FLAG_UPDATE_CURRENT);
        notification.setLatestEventInfo(this, "New Notifications",
                "Notification Content", contentIntent);
        nm.notify(R.string.app_name, notification);
    }

    private class PollTask extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... params) {
            showNotification();
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {

            stopSelf();
        }
    }

    private void handleIntent(Intent intent) {

        PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
        mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                "NotificationsService");
        mWakeLock.acquire();
        ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
        if (!cm.getBackgroundDataSetting()) {
            stopSelf();
            return;
        }
        new PollTask().execute();
    }
}

我调用此通知的BroadcastService类是:

public class MyScheduleReceiver extends BroadcastReceiver {

    private static final long REPEAT_TIME = 60000;

    @Override
    public void onReceive(Context context, Intent intent) {
        AlarmManager service = (AlarmManager) context
                .getSystemService(Context.ALARM_SERVICE);
        Intent i = new Intent(context, NotificationsService.class);
        PendingIntent pending = PendingIntent.getService(context, 0, i,
                PendingIntent.FLAG_CANCEL_CURRENT);
        service.cancel(pending);
        service.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                SystemClock.elapsedRealtime() + REPEAT_TIME, REPEAT_TIME, pending);
    }
}

我把它包含在Manifest.xml中:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.Android.WiC_MobileApp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="14" />

    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />

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

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.Light" >
        <activity
            android:name=".Activity_A"
            android:configChanges="orientation|keyboardHidden"
            android:label="@string/app_name"
            android:screenOrientation="portrait" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".Activity_B"
            android:configChanges="orientation|keyboardHidden"
            android:excludeFromRecents="true"
            android:label="@string/app_name"
            android:launchMode="singleTask"
            android:screenOrientation="portrait"
            android:taskAffinity="" />

        <service
            android:name="NotificationsService"
            android:icon="@drawable/icon"
            android:label="Notifications"
            android:process=":my_process" >
        </service>

        <receiver android:name=".MyScheduleReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
    </application>

</manifest>

谢谢

2 个答案:

答案 0 :(得分:1)

您应该将PendingIntent.getService更改为PendingIntent.getActivity

答案 1 :(得分:0)

问题在于清单

中的服务名称
<service
   android:name="NotificationsService"
   android:icon="@drawable/icon"
   android:label="Notifications">
</service>

服务与活动不在同一个包中,因此将其更改为以下工作。

<service
   android:name="com.android.myApp.Services.NotificationsService"
   android:icon="@drawable/icon"
   android:label="Notifications">
</service>