0

ブートタイムサービスを開始しようとすると、ランタイムエラーが発生します。その失敗ですが、私が見ることができるヒントはありません。目的はサービスを見つけることですが、onCreateまたはonStartには到達しません。

public class ControlReceiver extends BroadcastReceiver
{
  /**
   * @see android.content.BroadcastReceiver#onReceive(Context,Intent)
   */
  @Override
  public void onReceive(Context context, Intent intent)
  {
    Intent service = new Intent(context, MyApp.class);
    Log.d("rcvr", "Received intent:" + intent.getAction());
    context.startService(service);
  }
}

マニフェスト:

<manifest 
    android:versionCode="1" 
    android:versionName="1.0"
    package="com.company.package" 
    xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-sdk 
        android:minSdkVersion="9" 
        android:targetSdkVersion="10"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_GPS"/>
    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS"/>
    <uses-permission android:name="android.permission.ACCESS_CELL_ID"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_LOGS"/>
    <uses-permission android:name="android.permission.SET_ACTIVITY_WATCHER"/>
    <uses-permission android:name="android.permission.STATUS_BAR"/>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <uses-permission android:name="android.permission.BROADCAST_STICKY"/>
    <uses-permission android:name="android.permission.CONTROL_LOCATION_UPDATES"/>
    <uses-permission android:name="android.permission.SET_DEBUG_APP"/>
    <uses-permission android:name="android.permission.BATTERY_STATS"/>
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
    <uses-permission android:name="android.permission.BIND_DEVICE_ADMIN"/>
    <uses-permission android:name="android.permission.DIAGNOSTIC"/>
    <uses-permission android:name="android.permission.DEVICE_POWER"/>
    <uses-permission android:name="android.permission.DUMP"/>
    <uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"/>
    <uses-permission android:name="android.permission.SIGNAL_PERSISTENT_PROCESSES"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.PERSISTENT_ACTIVITY"/>
    <uses-permission android:name="android.permission.HARDWARE_TEST"/>
    <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>

    <application 
        android:icon="@drawable/ic_launcher"
        android:label="@string/mod_name" 
        android:name=".MyApp">

        <!-- We declare our service here -->
        <service 
            android:enabled="true" 
            android:exported="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/serv_name" 
            android:name=".MyApp" 
            android:process=":my_process">
            <intent-filter>
              <action android:name="com.company.package.MY_INTENT" />
            </intent-filter>
            </service>
        <receiver 
            android:name=".ControlReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
                <action android:name="android.intent.action.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE" />
            </intent-filter>
        </receiver>
        <receiver 
            android:name=".BatteryHelper" >
            <intent-filter>
                <action android:name="android.intent.action.BATTERY_OKAY"/>
                <action android:name="android.intent.action.BATTERY_CHANGED"/>
                <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
                <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
                <action android:name="android.intent.action.BATTERY_LOW"/>
                <category android:name="android.intent.category.INFO"/>
            </intent-filter>
        </receiver>
    </application>
</manifest>

スローされた例外

FATAL EXCEPTION: main 
java.lang.RuntimeException: Unable to instantiate application com.company.package.MyApp: java.lang.ClassCastException: com.company.package.MyApp cannot be cast to android.app.Application    
 at android.app.LoadedApk.makeApplication(LoadedApk.java:529)    
 at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4442)     
 at android.app.ActivityThread.access$1300(ActivityThread.java:139)     
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1305)     
 at android.os.Handler.dispatchMessage(Handler.java:99)     
 at android.os.Looper.loop(Looper.java:154)     
 at android.app.ActivityThread.main(ActivityThread.java:4945)    
 at java.lang.reflect.Method.invokeNative(Native Method)     
 at java.lang.reflect.Method.invoke(Method.java:511) 

更新
マニフェストからアプリケーションのandroid:name = "。MyApp"を削除すると、サービスが開始されました。誰もが理由を知っていますか?

4

1 に答える 1

0

アプリケーションの android:name=".MyApp" をマニフェストから削除すると、サービスが開始されました。理由を知っている人はいますか?

この理由は、おそらくMyAppクラスが拡張されていないという事実ですandroid.app.Application

Android 開発者サイトには次のように書かれています。

android:name

アプリケーション用に実装されたApplicationサブクラスの完全修飾名。アプリケーション プロセスが開始されると、このクラスはアプリケーションのどのコンポーネントよりも前にインスタンス化されます。

サブクラスはオプションです。ほとんどのアプリケーションでは必要ありません。サブクラスがない場合、Android は基本 Application クラスのインスタンスを使用します。

サブクラス化Applicationはオプションであるため、削除すると、アプリが実行しようとしている例外とまったく同じものにキャストしようandroid:name=".MyApp"としなくなるため、アプリを適切に起動できます。MyAppApplication

于 2013-03-26T17:29:41.117 に答える