startforeground使应用程序崩溃(androidstudio)

woobm2wo  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(618)

这个问题在这里已经有答案了

不幸的是,myapp已经停止。我怎样才能解决这个问题(20个答案)
27天前关门了。
我想做一个前台服务,每隔几秒钟调用一个异步任务。所以我定义了这样一个前台服务:(我还没有添加任务)

import android.app.Notification;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

import androidx.annotation.Nullable;
import androidx.core.app.NotificationCompat;

import static com.example.notif.App.ID;

public class Service extends android.app.Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    @Override
    public void onCreate() {
        super.onCreate();
    }

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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        Intent notificationIntent= new Intent(this, MainActivity.class);

        PendingIntent pendingIntent = PendingIntent.getActivity(this,0,notificationIntent,0);

        Notification notification = new NotificationCompat.Builder(this,ID)
                .setContentTitle("Title")
                .setContentText("Text")
                .setSmallIcon(R.drawable.ic_android)
                .setContentIntent(pendingIntent)
                .build();

        startForeground(2,notification);

        return START_STICKY;
    }

}

像这样编辑清单并将服务添加到其中。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.notif">
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <application
        android:name=".App"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:usesCleartextTraffic="true"

        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Notif">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name=".Service"></service> //i added service here
    </application>

</manifest>

我从一个onclick监听器开始:

public void start(View view) {
        Intent serviceIntent = new Intent(this,Service.class);
        startService(serviceIntent);
    }

当我按下按钮时,应用程序崩溃了。我做错什么了?我该怎么办?

4dc9hkyq

4dc9hkyq1#

你应该使用 ContextCompat.startForegroundService() 因为它会自动处理post和pre-oreo行为,如下所示

public static void startForegroundService(@NonNull Context context, @NonNull Intent intent) {
    if (Build.VERSION.SDK_INT >= 26) {
        context.startForegroundService(intent);
    } else {
        // Pre-O behavior.
        context.startService(intent);
    }
}

同时添加权限

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

针对android 9(api级别28)或更高版本并使用前台服务的应用程序必须请求前台服务权限
注意:如果目标api级别为28或更高的应用程序在未请求前台服务权限的情况下尝试创建前台服务,系统将抛出securityexception。

wz3gfoph

wz3gfoph2#

如果你的应用程序目标是api级别26或更高,并且你想创建前台服务,你应该调用 startForegroundService() 而不是 startService()

相关问题