Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 后台运行的服务应用程序_Android - Fatal编程技术网

Android 后台运行的服务应用程序

Android 后台运行的服务应用程序,android,Android,我需要创建一个简单的应用程序,它总是在手机运行时运行。应用程序应该和MQTT服务器对话,并在从服务器获取消息时显示主窗口 我创建了一个新项目,上面有空的活动和文本框。但如何在系统启动时要求系统启动我的应用程序并在后台运行它呢?您必须创建一个后台服务来与MQTT服务器通信。然后您需要将该后台服务转换为前台服务,因为从android Oreo开始的后台执行限制 请查看此链接以更好地了解: 您还应该使接收器在引导完成时运行。这可以在AndroidManifest中实现 像这样的 <receive

我需要创建一个简单的应用程序,它总是在手机运行时运行。应用程序应该和MQTT服务器对话,并在从服务器获取消息时显示主窗口


我创建了一个新项目,上面有空的活动和文本框。但如何在系统启动时要求系统启动我的应用程序并在后台运行它呢?

您必须创建一个后台服务来与MQTT服务器通信。然后您需要将该后台服务转换为前台服务,因为从android Oreo开始的后台执行限制

请查看此链接以更好地了解:

您还应该使接收器在引导完成时运行。这可以在AndroidManifest中实现

像这样的

<receiver android:name="com.example.StartUpBootReceiver" android:enabled="true" android:exported="true">
    <intent-filter>
         <action android:name="android.intent.action.BOOT_COMPLETED" />
         <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>            
</receiver>


希望这对你有帮助,祝你好运

如果我了解您的请求,您希望创建一个在后台运行的服务,并在系统启动时启动它:

在清单中添加以下内容:

  <receiver
            android:name=".StartSysytemReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.QUICKBOOT_POWERON" />
            </intent-filter>
  </receiver>
public class StartSysytemReceiver extends BroadcastReceiver {

    private static final String BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED";
    private static final String QUICKBOOT_POWERON = "android.intent.action.QUICKBOOT_POWERON";


    @Override
    public void onReceive(Context context, Intent intent) {
        if (BOOT_COMPLETED.equals(intent.getAction()) ||
                QUICKBOOT_POWERON.equals(intent.getAction())) {


            //schedule your  background service 
            scheduleJob(context);

        }
    }
}
//时间表

 public  void scheduleJob(Context context) {
            FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(context));
            RetryStrategy retryStrategy = dispatcher.newRetryStrategy(2, 300, 1800);
            Builder jobBuilder = dispatcher.newJobBuilder().setService(BackgroundJobService.class)
           .setTag("scheduleJob_112").setReplaceCurrent(true)
           .setRecurring(false).setLifetime(2)
           .setRetryStrategy(retryStrategy).setConstraints(new int[]{2});
            Job myJob = jobBuilder.build();
            dispatcher.mustSchedule(myJob);
          }
public class BackgroundJobService extends JobService {
    private static final String TAG = "BackgroundJobService";
    boolean isWorking = false;
    boolean jobCancelled = false;

    public BackgroundJobService () {
    }

    public boolean onStartJob(JobParameters jobParameters) {
        this.isWorking = true;
         this.doWork(jobParameters);
        return this.isWorking;
    }

    private void doWork(JobParameters jobParameters) {
        if (!this.jobCancelled) {
          //callYour service her
            this.getBaseContext().startService(new Intent(this.getBaseContext(), ServiceToCall.class));
            this.isWorking = false;
            this.jobFinished(jobParameters, true);
        }
    }

    public boolean onStopJob(JobParameters jobParameters) {
        this.jobCancelled = true;
        boolean needsReschedule = this.isWorking;
        this.jobFinished(jobParameters, this.isWorking);
        return needsReschedule;
    }
}
//backgroundJobService

 public  void scheduleJob(Context context) {
            FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(context));
            RetryStrategy retryStrategy = dispatcher.newRetryStrategy(2, 300, 1800);
            Builder jobBuilder = dispatcher.newJobBuilder().setService(BackgroundJobService.class)
           .setTag("scheduleJob_112").setReplaceCurrent(true)
           .setRecurring(false).setLifetime(2)
           .setRetryStrategy(retryStrategy).setConstraints(new int[]{2});
            Job myJob = jobBuilder.build();
            dispatcher.mustSchedule(myJob);
          }
public class BackgroundJobService extends JobService {
    private static final String TAG = "BackgroundJobService";
    boolean isWorking = false;
    boolean jobCancelled = false;

    public BackgroundJobService () {
    }

    public boolean onStartJob(JobParameters jobParameters) {
        this.isWorking = true;
         this.doWork(jobParameters);
        return this.isWorking;
    }

    private void doWork(JobParameters jobParameters) {
        if (!this.jobCancelled) {
          //callYour service her
            this.getBaseContext().startService(new Intent(this.getBaseContext(), ServiceToCall.class));
            this.isWorking = false;
            this.jobFinished(jobParameters, true);
        }
    }

    public boolean onStopJob(JobParameters jobParameters) {
        this.jobCancelled = true;
        boolean needsReschedule = this.isWorking;
        this.jobFinished(jobParameters, this.isWorking);
        return needsReschedule;
    }
}

下面是一个关于如何在设备启动时启动服务的好答案:

根据您的需要,最好使用前台服务或WorkManager。最新的安卓SDK对后台服务有多个限制,主要不是在服务中可以做什么,而是在后台可以运行多长时间。以下是一些细节:

关于在服务内部的事件之后打开活动。这不符合Android用户体验的指导原则和限制。理想情况下,所有UI事件/更改只应在用户操作之后发生。以下是指引:

对于您的情况,我认为最好的解决方案是向用户显示通知,单击该通知将打开您的应用程序/活动

在这里,您可以看到如何显示来自服务的通知以及如何处理用户在该通知上的操作:

我想您正在寻找WorkManager,我希望您需要一个前台服务,它需要在通知栏中显示一个持久的通知。如果您不关心立即接收消息,那么
WorkManager
将是一个更好的选择。您需要在代码中学习和实现一些东西。首先是。第二个是(或许多其他链接)。然后您应该[在检测到事件时启动活动]()。祝你好运