定时启动android 服务_android定时器定时启动app - CSDN
  • 启动service进行后台任务的时候,我们一般的 做法是启动一个线程,然后通过sleep方法来控制进行定时的任务,如轮询操作,消息推送。这种service的资源是很容易被回收的,虽然service的优先级很高,但是还没有前台...
    
            当启动service进行后台任务的时候,我们一般的 做法是启动一个线程,然后通过sleep方法来控制进行定时的任务,如轮询操作,消息推送。这种service的资源是很容易被回收的,虽然service的优先级很高,但是还没有前台的activity的优先极高,所以一旦资源被回收,service会停止运行。
            service被回收是我们不能控制的,但是我们可以控制service的重启活动。在service的onStartCommand
    方法中可以返回一个参数来控制重启活动
            1、Service.START_STICKY,就会在资源被回收(用手机加速程序加速)或者程序异常(异常结束程序,测试的时候手动抛出一个异常)的时候重新调用oncreate、onStartCommand来启动服务。但是不能连续重启两次。像音乐播放器,这种需要持续运行的,断开后可以马上重启,但是传送过来的intent为null。
                这种模式通常用于处理自身状态的service,以及需要通过startService和stopService显示的启动和终止的Service,如音乐播放器的service
            2、START_NOT_STICKY就不会重新启动服务。比如说更新操作,他会考虑到资源竞争,比较谨慎,不会自动启动service。此处onstartcommand方法中的intent是本次传送过来的intent。当被异常终止后,只有重新startService 调用,这个servie才会启动。
                这种模式比较谨慎,当停止后,它会在下一个调度中尝试重新启动,不会再资源竞争的时候重启,对于处理特殊请求,尤其诸如更新操作或者网络轮询这样的定期处理。
            3、START_REDELIVER_INTENT不会马上重启service。需要在下次调用启动这个service的时候会获得上次传入的intent,然后执行两次onStartCommand方法。只执行一次oncreat方法。也就是说可以把上次没有完成的工作这一次也完成(传送过来的intent是保留的上一次的intent和本次传送的intent)。一般用于不是无限循环的任务。
            这种模式是要确保service中的命令得以完成。--例如在时效性比较重要的时候
    注意,在处理完成后,每种模式都要求使用stopService和stopSelf显式的停止service。

    从以上的参数中可以看出,service的重启操作不能只依靠参数返回值来实现,能够重启的只有Service.START_STICKY,但是这种方法只能重启一次,再次断开的时候就不能实现重连操作了。所以必须使用AlarmManager的定时任务来实现网络的轮询等定时任务。可以看到使用START_NOT_STICKY的返回值是最适合网络轮询操作的。


    AlarmManager的工作原理。alarmmanager会定时的发出一条广播,然后在自己的项目里面注册这个广播,重写onReceive方法,在这个方法里面启动一个service,然后在service里面进行网络的访问操作,当获取到新消息的时候进行推送,同时再设置一个alarmmanager进行下一次的轮询,当本次轮询结束的时候可以stopself结束改service。这样即使这一次的轮询失败了,也不会影响到下一次的轮询。这样就能保证推送任务不会中断。
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    new Thread(new Runnable() {
    @Override
    public void run() {
    Log.d("LongRunningService", "executed at " + new Date().
    toString());
    }
    }).start();
    AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
    int anHour = 60 * 60 * 1000; // 这是一小时的毫秒数
    long triggerAtTime = SystemClock.elapsedRealtime() + anHour;
    Intent i = new Intent(this, AlarmReceiver.class);
    PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0);
    manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi);
    return super.onStartCommand(intent, flags, startId);
    }
    }




     我们在 onStartCommand()方法里开启了一个子线程, 然后在子线程里就可以执行具体的逻辑操作了。这里简单起见,只是打印了一下当前的时间。
    创建线程之后的代码就是我们刚刚讲解的 Alarm 机制的用法了,先是获取到了AlarmManager 的实例,然后定义任务的触发时间为一小时后,再使用 PendingIntent 指定处理定时任务的广播接收器为 AlarmReceiver,最后调用 set()方法完成设定。
    显然,AlarmReceiver目前还不存在呢,所以下一步就是要新建一个 AlarmReceiver类,
    并让它继承自 BroadcastReceiver,代码如下所示: 我们在 onStartCommand()方法里开启了一个子线程, 然后在子线程里就可以执行具体的逻辑操作了。这里简单起见,只是打印了一下当前的时间。
    创建线程之后的代码就是我们刚刚讲解的 Alarm 机制的用法了,先是获取到了AlarmManager 的实例,然后定义任务的触发时间为一小时后,再使用 PendingIntent 指定处理定时任务的广播接收器为 AlarmReceiver,最后调用 set()方法完成设定。
    显然,AlarmReceiver目前还不存在呢,所以下一步就是要新建一个 AlarmReceiver类,
    并让它继承自 BroadcastReceiver,代码如下所示:
    public class AlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
    Intent i = new Intent(context, LongRunningService.class);
    context.startService(i);
    }
    }


    onReceive()方法里的代码非常简单,就是构建出了一个 Intent 对象,然后去启动LongRunningService 这个服务。那么这里为什么要这样写呢?其实在不知不觉中,这就已经将一个长期在后台定时运行的服务完成了。因为一旦启动 LongRunningService,就会在onStartCommand()方法里设定一个定时任务,这样一小时后 AlarmReceiver 的 onReceive()方法就将得到执行,然后我们在这里再次启动 LongRunningService,这样就形成了一个永久的循环,保证 LongRunningService 可以每隔一小时就会启动一次,一个长期在后台定时运行的服务自然也就完成了。
            另外需要注意的是,从 Android 4.4 版本开始,Alarm 任务的触发时间将会变得不准确,有可能会延迟一段时间后任务才能得到执行。这并不是个 bug,而是系统在耗电性方面进行的优化。系统会自动检测目前有多少 Alarm任务存在,然后将触发时间将近的几个任务放在一起执行,这就可以大幅度地减少 CPU被唤醒的次数,从而有效延长电池的使用时间。当然,如果你要求 Alarm任务的执行时间必须准备无误,Android仍然提供了解决方案。使用 AlarmManager的 setExact()方法来替代 set()方法,就可以保证任务准时执行了。
    展开全文
  • Android定时自动启动应用程序

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

    也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                   

    使用AlarmManager搭配Receiver应该可以实现定时自动启动应用程序:

    import android.app.Activity;import android.app.AlarmManager;import android.app.PendingIntent;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class StartTiming extends Activity {        public final String MYACTION = "android.intent.action.STARTMYAP";        /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                Button btn = (Button)this.findViewById(R.id.btnClose);        btn.setOnClickListener(new OnClickListener(){            @Override            public void onClick(View v) {                // TODO Auto-generated method stub                StartTiming.this.finish();            }        });        AlarmManager am = (AlarmManager)this.getSystemService(Context.ALARM_SERVICE);        Intent intent = new Intent(MYACTION);        PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, 1);        am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+15000, pi);//15秒钟以后启动    }}   
    import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.util.Log;public class AlarmReceiver extends BroadcastReceiver{    public final String MYTAG = "Ray";    @Override    public void onReceive(Context context, Intent intent) {        // TODO Auto-generated method stub        Log.v(MYTAG,"I am AlarmReceiver,I receive the message");        Intent in = new Intent();        in.setClass(context, StartTiming.class);        in.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);        context.startActivity(in);    }}


    <?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"      package="com.ray.test"      android:versionCode="1"      android:versionName="1.0" android:installLocation="auto">    <application android:icon="@drawable/icon" android:label="@string/app_name">        <activity android:name=".StartTiming"                  android:label="@string/app_name">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <receiver android:name="AlarmReceiver">               <intent-filter>                 <action android:name="android.intent.action.STARTMYAP"/>             </intent-filter>        </receiver>    </application></manifest> 
               

    给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

    这里写图片描述
    展开全文
  • 2019独角兽企业重金招聘Python工程师标准>>> ...

    我司开发了一个APP, 叫“美乐时光”,简单地说他是一个听歌软件;


    它有一个功能叫“定时启动”,即早上(或你设定的时间)可以定时启动,然后放歌把你叫醒。

    这个功能中最麻烦的就是“点亮屏幕”和“解开屏幕锁”。

    用GOOGLE一搜“”,文章一大堆,什么PowerManager, KeyguardManager,代码大同小异,但是我认真地试了,基本只能解开没有锁屏设置的手机(即按电源键就可以解锁的手机,连滑动解锁都没有的那种)。这有个屁用啊?

    后来只得去研究Android闹钟的源码?认认真真地读啊读,那个代码写得真是乱啊乱,我就一点一点地砍砍砍。。。

    一个上午过去了。。。

    最后终于找到了闹钟的秘密。

    对于我这个APP的情况,我只需要它定时放歌就行,不关心屏幕要不要解锁。所以PowerManger && KeyguardManager什么的,通通不需要。下面几行代码即可搞定

    1 <b>// 要解锁屏幕?
    2         {
    3             final Window win = getWindow();
    4             win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
    5                     | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
    6                     | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
    7                     | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
    8                     | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);
    9         }</b>
    把这段代码加到,定时启动的Activity上,就OK了~

    转载于:https://my.oschina.net/u/1189001/blog/148966

    展开全文
  • Android 定时启动应用

    2012-08-31 15:02:59
    使用AlarmManager和Receiver实现定时自动启动应用程序:   public class Main extends Activity { public final String MT_ACTION = "android.intent.action.START_MY_APP"; Button bt; public ...

     

    使用AlarmManager和Receiver实现定时自动启动应用程序:

     

    public class Main extends Activity {
            public final String MT_ACTION = "android.intent.action.START_MY_APP"; 
            Button bt;
        public void onCreate(Bundle savedInstanceState) 
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            bt = (Button)findViewById(R.id.bt);
            bt.setOnClickListener(new View.OnClickListener() {
                            public void onClick(View v) {
                                    Main.this.finish();
                            }
                    });
            AlarmManager am = (AlarmManager)Main.this.getSystemService(Context.ALARM_SERVICE);
            Intent intent = new Intent(MT_ACTION);
            PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, 1);
            am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+3500, pi);
        }
    }

     

    Manifext:

     

     

     

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.vancl.startapp"
          android:versionCode="1"
          android:versionName="1.0">
        <uses-sdk android:minSdkVersion="8" />
    
        <application android:icon="@drawable/icon" android:label="@string/app_name">
            <activity android:name=".Main"
                      android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
                    <receiver android:name="AlarmReceiver">  
                   <intent-filter>  
                     <action android:name="android.intent.action.START_MY_APP"/>  
                 </intent-filter>  
            </receiver> 
        </application>
    </manifest>
    
     

     

     

    Receiver:

     

     

    package com.vancl.startapp;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    
    public class AlarmReceiver extends BroadcastReceiver {
            public void onReceive(Context context, Intent intent) {
                    Intent it = new Intent();
                    it.setClass(context, Main.class);
                    it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    context.startActivity(it);	//接受到广播 启动应用
            }
    
    }
     

     


    展开全文
  • Android Service 定时任务

    2019-11-05 17:43:06
    Android 中的定时任务一般有两种实现方式 (这里我们使用的是Android 的 Alarm 机制 ) 1.Java API提供的Timer类 不太适用于那些需要长期在后台运行的定时任务。我们都知道,为 了能让电池更加耐用,每种手机都会...
  • 为什么80%的码农都做不了架构师?>>> ...
  • 前言最近因项目需求,在类似于ATM机上的android系统上开发一款app,需要实现开机即启动app,防止客户脱离app做其他操作,并且需要定时重启项目更新某些数据。1.实现开机即启动思路 实际上,系统开机的时候就会发送一...
  • * java定时任务,每天定时执行任务 * @author wls * */ public class TimerManager { //时间间隔 private static final long PERIOD_DAY = 24 * 60 * 60 * 1000; public TimerManager() { Calendar calend.....
  • 定时任务实现总结在Android中这算是一个常用的功能了,,有兴趣一起来探讨下可以Android消息机制首先来了解一下Android的消息处理机制 即Handlerd的运行机制,handler的运行需要底层的MessageQueue和Looper的支撑。...
  • Android定时任务1,Java的API提供的Timer类 Android 中使用容易受手机的休眠系统影响(例如:手机休眠,导致了这个功能的停止)。2,Android的Alarm机制Alarm 机制:主要就是借助了AlarmManager 类来实现的。这个...
  • Android Service 自动启动

    2011-12-09 14:00:11
    我们在使用某些Android应用的时候,可能会发现安装了某应用以后,会有一些服务也会随之运行。而且,这些服务每次都会随着手机开机而启动。有的服务做的更绝,当用户停止该服务器以后,过了一段时间,服务又自动运行...
  • android 定时上传服务及异步任务AsyncTask 来自 ———-本文为hzjst博主原创文章,未经博主允许不得转载。(一) 定时上传服务器主要还是利用TimerTask进行定时,代码如下:dingshi(){ Timer timer = new Timer(); ...
  • 关于service 大家应都知道是android 四大组件之一,用来执行后台任务的。 如果还不太了解service 可以看看郭大神写的Android Service完全解析,关于服务你所需知道的一切,...
  • 重开一篇,完整讲述我这个半吊子的android 入门人员是怎么做出一个可以定时启动并且发送短信,读取回信里面的密码 这个功能的app 至于我为什么要做这个功能,可以看上一篇文章。主要是大学里面宽带密码...
  • Android中的定时任务一般有两种实现方式,一种是使用Java API里提供的Timer类,一种是使用Android的Alarm机制。这两种方式在多数情况下都能实现类似的效果,但Timer有一个明显的短板,它并不太适用于那些需要长期在...
  • 有一个需求,因为后台没做接口,为了测试,实现基本展示功能,将让设备运动的指令动作,因此,打算将指令做成一个数组,绑定服务,由服务在后台定时发送指令。 服务类:用timer和timertask做定时处理;另外一个方法...
  • 现在很多公司都开始做智能硬件产品,主要是在Android开发板上面开发应用app,尤其这两年物联网越来越火,这方面的需求越来越多,目前公司也是做智能公交站台的,需要开发的app实现开机自启动,异常崩溃重新启动,...
1 2 3 4 5 ... 20
收藏数 18,490
精华内容 7,396
关键字:

定时启动android 服务