3

私のアクティビティActivity_Aの 1 つで、この方法で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();
    }
}

この Notification を呼び出す 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>

ありがとうございました

4

2 に答える 2

1

次のように変更する必要がありPendingIntent.getServiceますPendingIntent.getActivity

于 2012-10-12T10:58:12.490 に答える
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>
于 2012-10-15T08:28:10.230 に答える