IntentService не вызывается

Я пытаюсь отправить Intent из onCreate в Activity, чтобы запустить IntentService. Однако onHandleIntent IntentService никогда не принимается. Я попытался изменить манифест с помощью фильтров намерений, но, похоже, ничего не работает. Исключения не выбрасываются, но IntentService просто не вызывается.

Вот onCreate

@Override
public void onCreate(Bundle savedInstanceState)
{

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    db = new TwitterDB(this);
    String[] columns = new String[1];
    columns[0] = TwitterDB.TEXT;
    tAdapter = new SimpleCursorAdapter(this, 0, null, columns, null, 0); 
    tweets = (ListView)findViewById(R.id.listtwitter);
    tweets.setAdapter(tAdapter);

    Intent intent = new Intent(this, SyncService.class);
    intent.putExtra("action", SyncService.TWITTER_SYNC);
    this.startService(intent);

}

Вот создатель и onHandleIntent класса IntentService, я знаю, что он не вызывается, потому что logcat никогда не показывает «Полученное намерение». Конструктор тоже не вызывается (там был вызов лога, но я его удалил.

public SyncService(){
    super("SyncService");
    twitterURI = Uri.parse(TWITTER_URI);
    Log.i("SyncService", "Constructed");
}

@Override
public void onHandleIntent(Intent i){
    int action = i.getIntExtra("action", -1);
    Log.i("SyncService", "Retrieved intent");
    switch (action){
        case TWITTER_SYNC:
            try{
                url = new URL(twitterString);
                conn = (HttpURLConnection)url.openConnection();
                syncTwitterDB();
                conn.disconnect();
            }catch(MalformedURLException e){
                Log.w("SyncService", "Twitter URL is no longer valid.");
                e.printStackTrace();
            }catch(IOException e){
                Log.w("SyncService", "Twitter connection could not be established.");
                e.printStackTrace();
            }
            break;
        default:;
            // invalid request
    }
}

А вот и манифест.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.twitter"
    android:versionCode="1"
    android:versionName="1.0" >

<uses-sdk android:minSdkVersion="15" />
<uses-permission android:name="android.permission.INTERNET"/>
<application android:icon="@drawable/ic_launcher"               
         android:label="@string/app_name" >
    <activity
        android:name=".TwitterTwoActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        <service android:name="SyncService"/>
    </activity>
</application>
</manifest>

person Jbad26    schedule 13.07.2012    source источник


Ответы (2)


Переместите объявление службы за пределы TwitterTwoActivity в файле XML, как я сделал здесь:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.twitter"
    android:versionCode="1"
    android:versionName="1.0" >

<uses-sdk android:minSdkVersion="15" />
<uses-permission android:name="android.permission.INTERNET"/>
<application android:icon="@drawable/ic_launcher"               
         android:label="@string/app_name" >
    <activity
        android:name=".TwitterTwoActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>  
    <service android:name="SyncService"/>

</application>
</manifest>
person Richard    schedule 13.07.2012

Вам нужно указать путь к сервису в манифесте, просто указать имя недостаточно.

Изменять

<service android:name="SyncService"/>

to

<service android:name=".SyncService"/>

если SyncService находится в корневом каталоге вашего пакета, при необходимости добавьте соответствующую папку перед .SyncService.

person Jug6ernaut    schedule 13.07.2012
comment
Спасибо, это правильная практика, но я думаю, что она находится в правильной папке. - person Jbad26; 13.07.2012