当前位置: 首页 > 知识库问答 >
问题:

Android服务需要在十分钟内持续运行

充高扬
2023-03-14

我希望即使应用程序被关闭(杀死),或者即使用户没有启动应用程序,服务也在运行。我想在应用程序安装后启动服务,从这一点开始,服务要求每十分钟运行一次。

虽然我找到了一些解决方案,比如

    null
public class MyService extends Service {

    MyReceiver receiver = new MyReceiver();

    public void onCreate()
    {
        super.onCreate();       
    }

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

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

    @Override        
    public void onStart(Intent intent, int startId)
    {
        receiver.SetAlarm(this);
    }

}
public class MyReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        try {
            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();
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

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

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

<service android:name=".MyService" 
            android:exported="false" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </service>

 <receiver android:name=".MyReceiver" >
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
        </receiver>

我在我的主要活动中添加了以下代码。

Intent service = new Intent(getApplicationContext(), MyService.class);
        this.startService(service);

共有1个答案

阎伟志
2023-03-14

Android操作系统将通知当您安装应用程序表单播放商店。

1.在清单文件中添加接收器,该文件将通知您用户已安装应用程序:

<receiver android:name="com.mypackagename.Installreceiver" android:exported="true">
      <intent-filter>
          <action android:name="com.android.vending.INSTALL_REFERRER" />
     </intent-filter>
</receiver>

2.启动服务将从安装接收器广播接收器每10分钟继续运行一次。

public class Installreceiver extends BroadcastReceiver{
       @Override
        public void onReceive(Context context, Intent intent) {
        context.startService(new Intent(context.getApplicationContext(), YourService.class));
       }
    }
public class YourService extends Service {

    private static String TAG = "MyService";
    private Handler handler;
    private Runnable runnable;
    private final int runTime = 10000;

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG, "onCreate");

        handler = new Handler();
        runnable = new Runnable() {
            @Override
            public void run() {

                handler.postDelayed(runnable, runTime);
            }
        };
        handler.post(runnable);
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }
}

更新1:

3.如果操作系统关闭了您的服务,那么您需要重新开始,做另一个接收器。

在服务中添加以下两种方法:

@Override
public void onTaskRemoved(Intent rootIntent) {
   super.onTaskRemoved(rootIntent);
   sendBroadcast(new Intent("IWillStartAuto"));
}

 @Override
 public void onDestroy() {
   super.onDestroy();
   sendBroadcast(new Intent("IWillStartAuto"));
 }
<receiver android:name=".RestartServiceReceiver" >
     <intent-filter>
         <action android:name="IWillStartAuto" >
         </action>
      </intent-filter>
 </receiver>
public class RestartServiceReceiver extends BroadcastReceiver{
   @Override
    public void onReceive(Context context, Intent intent) {
    context.startService(new Intent(context.getApplicationContext(), YourService.class));
   }
}
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver android:name=".BootCompletedReceiver" >
      <intent-filter>
             <action android:name="android.intent.action.BOOT_COMPLETED" />
             <action android:name="android.intent.action.QUICKBOOT_POWERON" />
      </intent-filter>
</receiver>
public class BootCompletedReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent arg1) {
    context.startService(new Intent(context.getApplicationContext(), YourService.class));
  }
}

希望这对你有帮助。

 类似资料:
  • 我想让IntentService在后台运行,即使应用程序被终止。但如果我从最近的屏幕上删除我的应用程序,我的服务就会停止。我怎样才能避免这种情况?换句话说,即使我的应用关闭了,最近的应用也无法运行,我该如何保持我的服务运行? 我的前台服务: 我的常数: 我的清单: 当应用程序打开时,我看到服务正在运行。当我通过home按钮最小化应用程序时,它仍在运行。当我通过后退按钮关闭应用程序时,它仍在运行。但

  • 我正在尝试创建一个在Android 4.2中运行连续语音识别的服务。使用此链接中的答案(Android 4.1上的Android语音识别服务 我到底做错了什么? 相关活动代码(从活动调用的静态方法,actiityContext是调用此方法的活动): 服务代码:

  • 因此,我一直在Android Studio中开发一个简单的应用程序,从过去几天开始,每当我点击“运行”,就需要5分钟以上的时间来构建。以前可没这么慢。我不知道为什么。它说“Gradle构建运行”,然后应用程序在5分钟后加载。这种情况发生在模拟器和我的android设备上。我的年级版本是2.10,我查了这个问题,我尝试了其他类似帖子建议的一切,包括: 向命令行选项设置添加--并行和--脱机 在分级设

  • 大家好,耶稣受难节, 我知道这似乎是一个重复的问题,但事实并非如此,我将向您解释原因: 有几种方法可以在计划的时间执行任务,如TimerTask或ScheduleExecutorService,但它们都不适合我要做的事情,因为这些方法都是这样工作的: -- 但我不希望我的代码在计划时间后一次又一次地运行,我希望我的代码总是在每个计划时间执行,即使是第一次。 还有一个问题:如果android停止后台

  • 问题内容: 我的公司正在考虑更改连续集成服务器(我不会说我们现在拥有哪台服务器,因此无论如何我都不会歪曲您的回答:))我想知道是否有人提出建议?最佳的用户体验,维护难度等… 我们的代码全部使用Java,并且我们将ANT用作构建工具。 问题答案: 我最近实现了哈德森服务器。以前使用过Cruise Control, 我对Hudson感到非常满意,并且对它的易于设置和使用印象深刻。 与Cruise Co

  • 我知道我可以为每一分钟设置cron就像 谢谢