简体   繁体   English

在App未运行时使用AlarmManager运行服务

[英]Using AlarmManager to run a Service when App is not running

I want to schedule a call to a Service every X time: 我想每X次安排对Service的呼叫:

In my activity I created alarm: 在我的活动中,我创建了警报:

        // OnCreate()
        alarmIntent = new Intent ( this, AlarmReceiver.class );
        pendingIntent = PendingIntent.getBroadcast( this.getApplicationContext(), 1, alarmIntent, 0 );
        alarmManager = ( AlarmManager ) getSystemService( ALARM_SERVICE );
        alarmManager.setRepeating( AlarmManager.RTC_WAKEUP, ( 30 * 1000 ),( 30 * 1000 ), pendingIntent );

and In the Receiver : 并在接收器中:

public class AlarmReceiver extends BroadcastReceiver {

    private static final String DEBUG_TAG = "AlarmReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(DEBUG_TAG, "Recurring alarm; requesting download service.");

        // start the download
        Intent downloader = new Intent(context, MyService.class);
        context.startService(downloader);
    }

}

In AndroidManifest.xml I register it: 我在AndroidManifest.xml注册了它:

 <receiver android:name="com.myapp. AlarmReceiver"></receiver>

It works only when app is running ...How can I schedule that so it work even If user close the app? 它仅在应用程序正在运行时才起作用...我如何安排它,以便即使用户关闭该应用程序也能起作用?

i found this code in internet and it works, may be  can help you.

package YourPackage;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.PowerManager;
import android.widget.Toast;

public class Alarm extends BroadcastReceiver 
{    
     @Override
     public void onReceive(Context context, Intent intent) 
     {   
         PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
         PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
         wl.acquire();

         // Put here YOUR code.
         Toast.makeText(context, "Alarm !!!!!!!!!!", Toast.LENGTH_LONG).show(); // For example

         wl.release();
     }

 public void SetAlarm(Context context)
 {
     AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
     Intent i = new Intent(context, Alarm.class);
     PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
     am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),1000 * 60 * ,pi);
  }

 public void CancelAlarm(Context context)
 {
     Intent intent = new Intent(context, Alarm.class);
     PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
     AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
     alarmManager.cancel(sender);
 }
 }


 //Set Alarm from Service:


package YourPackage;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;

public class YourService extends Service
{
    Alarm alarm = new Alarm();
    public void onCreate()
    {
        super.onCreate();       
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId){
         alarm.SetAlarm(YourService.this);
         return START_STICKY;
    }



public void onStart(Context context,Intent intent, int startId)
{
    alarm.SetAlarm(context);
}

@Override
public IBinder onBind(Intent intent) 
{
    return null;
}
}
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
...
<receiver android:name=".AutoStart">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"></action>
    </intent-filter>
</receiver>




package YourPackage;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class AutoStart extends BroadcastReceiver
{   
    Alarm alarm = new Alarm();
    @Override
    public void onReceive(Context context, Intent intent)
    {   
        if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED"))
        {
            alarm.SetAlarm(context);
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 设置AlarmManager在Android应用未运行时运行? - Setting up AlarmManager to run when Android app isn't running? 当应用程序处于后台时,以给定的时间间隔将位置保存到服务器。 长期运行的服务与AlarmManager - Saving location to server in a given interval when app is in background. Long running service vs AlarmManager AlarmManager未运行服务 - AlarmManager not running the Service 与 AlarmManager 和服务一起使用时,通知在 Android 中不起作用 - Notification not working in Android when using with AlarmManager and Service 使用AlarmManager每20秒运行一次Android服务不会在从应用列表中删除该应用时重启 - Running an Android Service after every 20 sec using AlarmManager doesn't restart on killing the app from the app list 使用AlarmManager运行通知 - Running a notification using AlarmManager 使用AlarmManager.setRepeating每5秒运行一次服务 - using AlarmManager.setRepeating to run a service every 5 seconds 如果未与AlarmManager一起运行,请启动服务 - Start service if it's not running with AlarmManager 当应用程序被杀死时,AlarmManager 在前台服务中不起作用 - AlarmManager does not work in foreground service, when app was killed 应用程序更新时的Alarmmanager - Alarmmanager when app is updated
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM