尝试在android中创建后台服务时出错(应用程序崩溃) [英] Error trying to create a backgroundservice in android (app crashes)

查看:61
本文介绍了尝试在android中创建后台服务时出错(应用程序崩溃)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试在后台创建一个带有服务的应用程序,用于监听加速度的变化。当我现在尝试启动服务时,应用程序崩溃:

这是错误消息:

 05-30 19:11:03.764 12650- 12650 / com.name.flyrecorder E / AndroidRuntime:FATAL EXCEPTION:main 
进程:com.nameflyrecorder,PID:12650
java.lang.RuntimeException:无法启动服务com.name.flyrecorder.CheckStart @ 3d998d with Intent {cmp = com.name.flyrecorder / .CheckStart}:java.lang.IllegalStateException:onCreate()之前的活动不可用的系统服务
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4079 )
在android.app.ActivityThread.access $ 2400(ActivityThread.java:221)
在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1897)
在android.os .Handler.dispatchMessage(Handler.java:102)
在android.os.Looper.loop(Looper.java:158)
在android.app.ActivityThread.main(ActivityThread.java:7225)
at java.lang.reflect.Method.invoke(Na方法)
at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120 )
引起:java.lang.IllegalStateException:onCreate()之前的活动不可用的系统服务在android.app.Activity.getSystemService(Activity.java:5762)
之前的
。 name.flyrecorder.SensorListener。< init>(SensorListener.java:16)
at com.name.flyrecorder.CheckStart $ TestAcc。< init>(CheckStart.java:38)
at com。 name.flyrecorder.CheckStart.onStartCommand(CheckStart.java:29)
在android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4062)
在android.app.ActivityThread.access $ 2400(ActivityThread.java :221)&NBSP;
在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1897) 
在android.os.Handler.dispatchMessage(Handler.java:102) 
在android.os.Looper.loop(Looper.java:158) 
在android.app.ActivityThread.main(ActivityThread.java:7225) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1230) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)





什么我试过了:



我的主菜:

 <?  xml     version   =  1.0   编码  =  utf-8 < span class =code-summarycomment>? >  
< manifest xmlns:android = http://schemas.android.com/apk/res/android

< span class =code-attribute> package = com.name.flyrecorder >

< application

android:allowBackup = true

android:icon = @ mipmap / ic_launcher

android:label = @ string / app_name

android:roundIcon = < span class =code-keyword> @ mipmap / ic_launcher_round

android:suppo rtsRtl = true

android:theme = @ style / AppTheme >
< 活动 android:name = 。MainActivity >
<
intent-filter >
< ; action android:name = android.intent.action.MAIN / >

< category android:name = android.intent.category.LAUNCHER / >
< / inten t-filter >
< / activity >
< service android:name = .CheckStart / >
< /应用程序 >

< / manifest >



这是我的主要活动:

  package  com.name.flyrecorder; 

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

@ Override
protected < span class =code-keyword> void onCreate(Bundle savedInstanceState){
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startService( new Intent( this ,CheckStart。));
}
public void startBackgroundListener(查看视图){

startService( new Intent( this ,CheckStart。));
}
}



我的服务:

  package  com.name.flyrecorder; 

import android.app.Service;
import android.content.Intent;
import android.hardware.SensorManager;
import android.os.AsyncTask;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;
import android.widget.Toast;

import java.util.Timer;
import java.util.TimerTask;

public class CheckStart extends 服务{
public CheckStart(){

}

@ Nullable
@ Override
public IBinder onBind(意图意图){
return null;
}

@覆盖
public int onStartCommand(Intent intent, int 标志, int startId){
Toast.makeText( this 服务已开始,Toast.LENGTH_SHORT)。show();
new TestAcc()。execute();

return Service.START_NOT_STICKY;
}
@覆盖
public void onDestroy(){
Toast.makeText( this 服务已停止,Toast.LENGTH_SHORT).show();
}
public class TestAcc extends AsyncTask< Void,Void,Void> {
SensorListener sensorListener = new SensorListener();
double [] sensor_values = new double [ 2 ];
@ Override
protected Void doInBackground(Void ... void){
new Timer()。schedule( new TimerTask(){
@覆盖
public void run() {
sensor_values = sensorListener.getValues();
Log.i( X String .valueOf(sensor_values [ 0 ]));
Log.i( Y String .valueOf( sensor_values [ 1 ]));
Log.i( < span class =code-string> Z, String .valueOf(sensor_values [ 2 ]));

}
}, 2000

);
return null;
}
}

}



和我的SensorListener:

  package  com.name.flyrecorder; 

import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.support.v4.app.FragmentActivity;

public class SensorListener extends FragmentActivity implements SensorEventListener {
传感器加速度计;
SensorManager sensorManager;
double ax,ay,az = 0 ;

public SensorListener(){
sensorManager =(SensorManager)getSystemService(SENSOR_SERVICE);
sensorManager.registerListener( this ,sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_NORMAL);
}
@覆盖
public void onSensorChanged(SensorEvent事件){
if (event.sensor.getType()== Sensor.TYPE_ACCELEROMETER){
ax = event.values [ 0 ];
ay = event.values [ 1 ];
az = event.values [ 2 ];
}

}

@覆盖
public void onAccuracyChanged(传感器传感器, int 准确度){

}
public double [] getValues(){
double [] values = {ax,ay,az};
返回值;
}
}

解决方案

2400(ActivityThread.java:221)
在android.app .ActivityThread


H.handleMessage(ActivityThread.java:1897)
在android.os.Handler.dispatchMessage(Handler.java:102)
在android.os .Looper.loop(Looper.java:158)
在android.app.ActivityThread.main(ActivityThread.java:7225)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit


MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main( ZygoteInit.java:1120)
引起:java.lang.IllegalStateException:onCreate()之前的活动不可用的系统服务
at android.app.Activity.getSystemService(Activity.java:5762)
at com.name.flyrecorder.SensorListener。< init>(SensorListener.java:16)
at com.name.flyrecorde r.CheckStart

I tried to create an App with an Service in background which listen for changes of the acceleration. When i now try to start the Service the app crashes:
This is the Error Message:

05-30 19:11:03.764 12650-12650/com.name.flyrecorder E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.nameflyrecorder, PID: 12650
    java.lang.RuntimeException: Unable to start service com.name.flyrecorder.CheckStart@3d998d with Intent { cmp=com.name.flyrecorder/.CheckStart }: java.lang.IllegalStateException: System services not available to Activities before onCreate()
        at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4079)
        at android.app.ActivityThread.access$2400(ActivityThread.java:221)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1897)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:158)
        at android.app.ActivityThread.main(ActivityThread.java:7225)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
     Caused by: java.lang.IllegalStateException: System services not available to Activities before onCreate()
        at android.app.Activity.getSystemService(Activity.java:5762)
        at com.name.flyrecorder.SensorListener.<init>(SensorListener.java:16)
        at com.name.flyrecorder.CheckStart$TestAcc.<init>(CheckStart.java:38)
        at com.name.flyrecorder.CheckStart.onStartCommand(CheckStart.java:29)
        at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4062)
        at android.app.ActivityThread.access$2400(ActivityThread.java:221) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1897) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:158) 
        at android.app.ActivityThread.main(ActivityThread.java:7225) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)



What I have tried:

My Mainfest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.name.flyrecorder">

    <application

        android:allowBackup="true"

        android:icon="@mipmap/ic_launcher"

        android:label="@string/app_name"

        android:roundIcon="@mipmap/ic_launcher_round"

        android:supportsRtl="true"

        android:theme="@style/AppTheme">
        <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=".CheckStart" />
    </application>

</manifest>


This is my Main Activity:

package com.name.flyrecorder;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        startService(new Intent(this, CheckStart.class));
    }
    public void startBackgroundListener(View view){

            startService(new Intent(this, CheckStart.class));
    }
}


My Service:

package com.name.flyrecorder;

import android.app.Service;
import android.content.Intent;
import android.hardware.SensorManager;
import android.os.AsyncTask;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;
import android.widget.Toast;

import java.util.Timer;
import java.util.TimerTask;

public class CheckStart extends Service {
    public CheckStart(){

    }

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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId){
        Toast.makeText(this, "Service Started", Toast.LENGTH_SHORT).show();
        new TestAcc().execute();

        return Service.START_NOT_STICKY;
    }
    @Override
    public void onDestroy(){
        Toast.makeText(this,"Service Stopped", Toast.LENGTH_SHORT).show();
    }
    public class TestAcc extends AsyncTask<Void, Void, Void>{
        SensorListener sensorListener = new SensorListener();
        double[] sensor_values = new double[2];
        @Override
        protected Void doInBackground(Void... voids) {
            new Timer().schedule(new TimerTask() {
                @Override
                public void run() {
                    sensor_values = sensorListener.getValues();
                    Log.i("X",String.valueOf(sensor_values[0]));
                    Log.i("Y",String.valueOf(sensor_values[1]));
                    Log.i("Z",String.valueOf(sensor_values[2]));

                }
            },2000

            );
            return null;
        }
    }

}


And my SensorListener:

package com.name.flyrecorder;

import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.support.v4.app.FragmentActivity;

public class SensorListener extends FragmentActivity implements SensorEventListener {
    Sensor accelerometer;
    SensorManager sensorManager;
    double ax,ay,az = 0;

    public SensorListener(){
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_NORMAL);
    }
    @Override
    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
            ax = event.values[0];
            ay = event.values[1];
            az = event.values[2];
        }

    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }
    public double[] getValues(){
        double[] values = {ax,ay,az};
        return values;
    }
}

解决方案

2400(ActivityThread.java:221) at android.app.ActivityThread


H.handleMessage(ActivityThread.java:1897) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:158) at android.app.ActivityThread.main(ActivityThread.java:7225) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit


MethodAndArgsCaller.run(ZygoteInit.java:1230) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) Caused by: java.lang.IllegalStateException: System services not available to Activities before onCreate() at android.app.Activity.getSystemService(Activity.java:5762) at com.name.flyrecorder.SensorListener.<init>(SensorListener.java:16) at com.name.flyrecorder.CheckStart


这篇关于尝试在android中创建后台服务时出错(应用程序崩溃)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆