使用报警管理器的后台服务

时间:2016-11-05 16:43:37

标签: android broadcastreceiver android-service android-pendingintent android-intentservice

我已经按照以下示例代码实现了Periodic后台服务。定期任务正确执行如果应用程序在第一次前景。如果,我关闭应用程序然后后台服务不起作用。

https://github.com/codepath/android_guides/wiki/Starting-Background-Services#using-with-alarmmanager-for-periodic-tasks

1)BootComplete的BroadcastReceiver服务

public class BootBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    // Launch the specified service when this message is received
    Intent startServiceIntent = new Intent(context, MyTestService.class);
    context.startService(startServiceIntent);
}
}

2)BroadcastReceiver启动服务

public class MyAlarmReceiver extends BroadcastReceiver {
public static final int REQUEST_CODE = 12345;

// Triggered by the Alarm periodically (starts the service to run task)
@Override
public void onReceive(Context context, Intent intent) {
    Intent i = new Intent(context, MyTestService.class);
    i.putExtra("foo", "bar");
    context.startService(i);
    Toast.makeText(context, "Welcome --------1", Toast.LENGTH_LONG).show();
}
}

3)IntenetService类:执行我的后台任务

public class MyTestService extends IntentService {


// Must create a default constructor
public MyTestService() {
    // Used to name the worker thread, important only for debugging.
    super("test-service");
}

@Override
public void onCreate() {
    super.onCreate(); // if you override onCreate(), make sure to call super().
}

@Override
protected void onHandleIntent(Intent intent) {
}   
}

4)服务从活动开始

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    scheduleAlarm();
}

// Setup a recurring alarm every half hour
public void scheduleAlarm() {
    // Construct an intent that will execute the AlarmReceiver
    Intent intent = new Intent(getApplicationContext(), MyAlarmReceiver.class);
    // Create a PendingIntent to be triggered when the alarm goes off
    final PendingIntent pIntent = PendingIntent.getBroadcast(this, MyAlarmReceiver.REQUEST_CODE,
            intent, PendingIntent.FLAG_UPDATE_CURRENT);
    // Setup periodic alarm every 5 seconds
    long firstMillis = System.currentTimeMillis(); // alarm is set right away
    AlarmManager alarm = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
    // First parameter is the type: ELAPSED_REALTIME, ELAPSED_REALTIME_WAKEUP, RTC_WAKEUP
    // Interval can be INTERVAL_FIFTEEN_MINUTES, INTERVAL_HALF_HOUR, INTERVAL_HOUR, INTERVAL_DAY
    alarm.setRepeating(AlarmManager.RTC_WAKEUP, firstMillis,
            30000, pIntent);
}
}

5)清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="test.org.help">

<permission
    android:name="test.org.help.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />

<uses-permission android:name="au.com.KPS.companion.ACCESS_DATA" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="test.org.help.permission.UA_DATA" />
<!-- GCM requires a Google account. -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<!-- This app has permission to register with GCM and receive message -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="test.org.help.permission.C2D_MESSAGE" />

<uses-feature
    android:name="android.hardware.camera"
    android:required="false" />
<uses-feature
    android:name="android.hardware.camera.autofocus"
    android:required="false" />
<uses-feature
    android:name="android.hardware.camera.flash"
    android:required="false" />
<uses-feature android:name="android.hardware.screen.landscape" />

<application
    android:name="test.org.help.KPSApp"
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:logo="@drawable/ic_actionbar_logo"
    android:theme="@style/AppTheme"
    tools:replace="android:icon, android:logo">

    <!-- Activities -->
    <activity
        android:name="test.org.help.ui.activity.SplashActivity"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        android:theme="@style/SplashTheme">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".ui.activity.JanRainLoginActivity"
        android:screenOrientation="portrait" />
    <activity
        android:name=".ui.activity.LinkListActivity"
        android:screenOrientation="portrait" />
    <activity
        android:name="test.org.help.ui.activity.KPSFragmentActivity"
        android:exported="true"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="adjustResize"></activity>
    <activity
        android:name="test.org.help.ui.activity.NotificationDialogActivity"
        android:excludeFromRecents="true"
        android:label=""
        android:launchMode="singleInstance"
        android:noHistory="true"
        android:screenOrientation="portrait"
        android:taskAffinity=""
        android:theme="@style/AppTheme.Dialog.Notification"></activity>

    <receiver
        android:name="test.org.help.receivers.NotificationReceiver"
        tools:ignore="ExportedReceiver">
        <intent-filter>
            <action android:name="test.org.help.util.ACTION_SHOW_AGENDA" />
            <action android:name="test.org.help.util.ACTION_SNOOZE" />
            <action android:name="test.org.help.util.ACTION_DISMISS" />
            <action android:name="test.org.help.util.ACTION_SHOW_DIALOG" />

            <data android:scheme="KPS" />
            <data android:mimeType="text/plain" />
            <data android:pathPattern="au\.org\.KPS\.util/.*" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>

    <activity
        android:name="com.google.zxing.client.android.CaptureActivity"
        android:screenOrientation="landscape"
        android:theme="@android:style/Theme.Light.NoTitleBar"
        tools:replace="android:theme,android:screenOrientation"></activity>
    <activity
        android:name="test.org.help.ui.activity.AppTutorialActivity"
        android:screenOrientation="portrait"
        android:theme="@style/SplashTheme"></activity>
    <activity
        android:name="test.org.help.ui.activity.TermsAndConditionsActivity"
        android:label="@string/title_terms_and_conditions"
        android:screenOrientation="portrait"></activity>
    <activity
        android:name="test.org.help.ui.activity.WarningActivity"
        android:label="@string/title_Warning"
        android:screenOrientation="portrait"></activity>
    <activity
        android:name="test.org.help.ui.activity.DifferentUserWarningActivity"
        android:label="@string/title_Warning"
        android:screenOrientation="portrait"></activity>
    <activity
        android:name="test.org.help.ui.activity.AppWhatsNewActivity"
        android:label="@string/title_Warning"
        android:screenOrientation="portrait"></activity>

    <activity
        android:name=".ui.activity.UserUpgradeActivity"
        android:label="@string/title_upgrade"
        android:screenOrientation="portrait"></activity>

    <activity
        android:name="eu.janmuller.android.simplecropimage.CropImage"
        android:label=""
        android:screenOrientation="portrait"></activity>

    <!-- Facebook -->
    <meta-data
        android:name="com.facebook.sdk.ApplicationId"
        android:value="@string/facebook_app_id" />

    <!-- Services -->

    <receiver android:name="com.mobileapptracker.Tracker">
        <intent-filter>
            <action android:name="com.android.vending.INSTALL_REFERRER" />
        </intent-filter>
    </receiver>

    <service
        android:name="test.org.help.service.DBUpdateService"
        android:exported="false"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="test.org.help.service.DBUpdateService"></action>
        </intent-filter>
    </service>

    <receiver android:name="test.org.help.receivers.TimeChangeReceiver">
        <intent-filter>
            <action android:name="android.intent.action.TIMEZONE_CHANGED" />
        </intent-filter>
    </receiver>


    <activity
        android:name="com.janrain.android.engage.ui.JRFragmentHostActivity"
        android:configChanges="orientation|screenSize"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="adjustResize|stateHidden" />
    <activity
        android:name="com.janrain.android.engage.ui.JRFragmentHostActivity$Fullscreen"
        android:configChanges="orientation|screenSize"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="adjustResize|stateHidden" />

    <!--Hockey app crash report-->
    <meta-data
        android:name="net.hockeyapp.android.appIdentifier"
        android:value="@string/hockey_app_id" />

    <receiver android:name="test.org.help.syncmanager.Network.NetworkAvailability">
        <intent-filter>
            <action android:name=".android.action.broadcast" />
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
        </intent-filter>
    </receiver>

    <activity
        android:name=".db.AndroidDatabaseManager"
        android:theme="@style/Theme.AppCompat.Light" /><!-- ATTENTION: This was auto-generated to add Google Play services to your project for
 App Indexing.  See https://g.co/AppIndexing/AndroidStudio for more information. -->
    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />
    <service
        android:name=".syncmanager.auto.MyTestService"
        android:exported="false" />

    <receiver
        android:name=".syncmanager.auto.MyAlarmReceiver"
        android:process=":remote"></receiver>

    <receiver android:name=".syncmanager.auto.BootBroadcastReceiver">

    </receiver>
</application>

</manifest>

如果将上面作为示例项目实现为单独的那么,后台服务总是正常执行。但如果尝试与我现有的代码集成,那么就无法工作......

已编辑:已找到解决方案 它通过在AndroidManifest.xml

中添加完整路径android:name服务得到解决
<service
    android:name="test.org.help.syncmanager.auto.MyTestService"
    android:exported="false" />

0 个答案:

没有答案