Android java.lang.RuntimeException:无法实例化服务{….}can';t实例化类;没有空构造函数
我尝试在Android应用程序中启动服务时出错 我在暂停活动之前启动服务rigth,以便将一些信息上载到服务器Android java.lang.RuntimeException:无法实例化服务{….}can';t实例化类;没有空构造函数,android,Android,我尝试在Android应用程序中启动服务时出错 我在暂停活动之前启动服务rigth,以便将一些信息上载到服务器 java.lang.RuntimeException: Unable to instantiate service can't instantiate class ; no empty constructor 问题出现在我启动服务时: protected void onPause() { super.onPause(); EditText nicknam
java.lang.RuntimeException: Unable to instantiate service can't instantiate class ; no empty constructor
问题出现在我启动服务时:
protected void onPause() {
super.onPause();
EditText nicknameText = (EditText) findViewById(R.id.EditText_Nickname);
EditText emailText = (EditText) findViewById(R.id.EditText_Email);
String strNickname = nicknameText.getText().toString();
String strEmail = emailText.getText().toString();
SharedPreferences.Editor editor = mGameSettings.edit();
editor.putString(GAME_PREFERENCES_NICKNAME, strNickname);
editor.putString(GAME_PREFERENCES_EMAIL, strEmail);
editor.commit();
//Antes de salir lanzamos una actividad nueva para hacer el upload de la info
Intent uploadService = new Intent(getApplicationContext(),UploaderService.class);
startService(uploadService);
}
然后服务将启动一个异步任务
public class UploaderService extends Service{
public UploaderService(){
super();
}
private UpLoadUserData upLoadUserData;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
upLoadUserData = new UpLoadUserData();
upLoadUserData.execute();
Log.d(DEBUG_TAG, "Settings and image upload requested");
return START_REDELIVER_INTENT;
}
@Override
public IBinder onBind(Intent intent) {
// no binding
return null;
}
}
舱单:
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.androidbook.btdt.hour6"
android:versionCode="1"
android:versionName="1.0"
android:installLocation="auto">
<uses-sdk
android:minSdkVersion="11"
android:targetSdkVersion="10"></uses-sdk>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<application
android:icon="@drawable/icon"
android:label="@string/app_name"
android:debuggable="true">
<activity
android:name=".QuizSplashActivity"
android:label="@string/app_name">
<intent-filter>
<action
android:name="android.intent.action.MAIN" />
<category
android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="QuizHelpActivity"></activity>
<activity
android:name="QuizMenuActivity"></activity>
<activity
android:name="QuizScoresActivity"></activity>
<activity
android:name="QuizSettingsActivity"></activity>
<activity
android:name="QuizGameActivity"></activity>
<service android:name="QuizSettingsActivity$UploaderService"></service>
</application>
</manifest>
首先,您不能拥有普通嵌套类的
服务。它必须是一个静态嵌套类
其次,拥有一个服务
,它是活动
的静态
嵌套类,这是非常奇怪的
第三,让一个服务
生成一个异步任务
,而不仅仅是使用IntentService
,这是非常奇怪的
第四,将getApplicationContext()
替换为this
。只有当您知道为什么要使用getApplicationContext()
并且不需要它时,才可以使用getApplicationContext()
。非常感谢
我可以通过从IntentService扩展到INSERVICE来成功地启动该服务
public static class UploaderService extends IntentService{
String DEBUG_TAG = UploaderService.class.getSimpleName();
SharedPreferences mGameSettings;
以及在Manifest.xml中定义意图服务
<service android:name=".QuizSettingsActivity$UploaderService"/>
TL:DR.你需要做的只是简单地做很多。