【问题标题】:Service onCreate and onStartCommand don't run服务 onCreate 和 onStartCommand 不运行
【发布时间】:2019-12-22 17:15:57
【问题描述】:

我正在构建一个用于音频播放的 android 服务(它是一个使用本机代码进行播放的颤振应用程序),但是在启动该服务时,它似乎没有运行 onCreate() 和 `onStartCommand()'。

我已经在这些函数中添加了一些打印或日志语句对其进行了测试,但它们从未运行过。我还确保将服务添加到AndroidManifest.xml

这是我启动服务的方式:

public class MainActivity extends FlutterActivity implements MethodCallHandler {
  public void onMethodCall(MethodCall call, Result result) {
    switch (call.method) {
      [...]
      case "startService":
        Intent serviceIntent = new Intent(getFlutterView().getContext(), AudioService.class);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
          this.startForegroundService(serviceIntent);
        } else {
          this.startService(serviceIntent);
        }
        break;
        [...]
    }
}

FlutterActivity是一个继承Activity的类

这里是服务类:

public class AudioService extends Service {
  public MediaPlayer audioPlayer;

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

  @Override
  public void onCreate() {
    super.onCreate();

    Log.i("Audio", "onCreate()");
  }

  @Nullable
  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStartCommand(intent, flags, startId);

    Log.i("Audio", "Starting service...");

    // create notification
    Intent notificationIntent = new Intent(this, MainActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(
            this,
            0,
            notificationIntent,
            0
    );

    Notification audioNotification = new NotificationCompat.Builder(this, CHANNEL_ID)
            .setContentTitle("Foreground service is running")
            .setContentText("This notification does nothing")
            .setSmallIcon(R.drawable.app_icon)
            .setContentIntent(pendingIntent)
            .build();

    startForeground(1, audioNotification);

    audioPlayer = new MediaPlayer();

    Log.i("Audio", "Service started successfuly");
    return START_STICKY;
  }

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

    // destroy the player
    stopAudio();
  }
  [...]
}

以及AndroidManifest中的服务声明:

<service 
      android:name=".AudioService"
      android:process="net.tailosive.app.AudioService"
      android:enabled="true"
      android:exported="true"/>

我看不出我在这里做错了什么。 值得一提的是,安装的包名是net.tailosive.app,而java文件、目录和manifest中包含的包名是com.example.tailosive。这可能是个问题吗?

【问题讨论】:

  • 您可以尝试将startForeground 放在onCreate 中,甚至在super.onCreate 之前。至少这是在使用前台服务时救了我一次的原因。

标签: java android flutter android-service


【解决方案1】:

还有,使用START_STICKY 的目的是什么,因为它是一个前台服务,并且只要显示正在进行的通知就保证它一直在运行?

【讨论】:

  • 这些事情有所帮助,但问题似乎是,我没有将 FOREGROUND_SERVICE 权限添加到 AndroidManifest.xml。感谢您的建议!
猜你喜欢
  • 2012-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多