2010-02-20 2 views
3

Я начинаю услугу, используя startService (намерение намерения) метод. Когда я вызываю эту функцию, она достигает onCreate услуг, но не может позвонить onStartCommand. Вот мой code--Запуск службы на платформе Android

@Override 
public void onReceive(Context context, Intent intent) { 
    // Send a text notification to the screen. 
    Log.e("mudit", "Action: " + intent.getAction()); 

    try { 
     ConnectivityManager connManager = (ConnectivityManager) context 
       .getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo info = connManager.getActiveNetworkInfo(); 
     Log.e("mudit", "getType: " + info.getType()); 
     Log.e("mudit", "isConnected: " + info.isConnected()); 
     if (info.isConnected()) { 

      Intent newinIntent = new Intent(context, service.class); 
      context.startService(newinIntent); 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
     Intent newinIntent = new Intent(context, service.class); 
     context.stopService(newinIntent); 

    } 

} 

код услуги -

package com.android.service; 

import android.app.Service; 
import android.content.Intent; 
import android.os.IBinder; 
import android.widget.Toast; 

public class service extends Service { 

    @Override 
    public IBinder onBind(Intent arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Toast.makeText(this, "Service created...", Toast.LENGTH_LONG).show(); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Toast.makeText(this, "Service destroyed ...", Toast.LENGTH_LONG).show(); 
    } 

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

     Toast.makeText(this, "onStartCommand...", Toast.LENGTH_LONG).show(); 
     return 1; 
    } 

} 

Manifest.xml -

<receiver class=".AReceiver" android:name=".AReceiver"> 
     <intent-filter> 
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
     </intent-filter> 
    </receiver> 
    <service class=".service" android:name=".service" 
     android:enabled="true" android:icon="@drawable/icon"> 
    </service> 
+0

для отладки, я предпочел бы использовать LOG, в отличие от тоста. сначала получите код для работы в процессе принятия решений. Хороший совет от @JPM не означает, что вы используете сервис «Сервис». назовите это «myService», если вы хотите быть расплывчатым. –

ответ

2

larsVogel решает эту проблему (и многих других, подобных ему) in this excellent post.

это, как я приспособил его код, чтобы создать приемник подключения, который отслеживает, когда пользователь подключается к сети WI-FI так, чтобы пакетные данные об использовании загрузки:

в файле манифеста, поместить приемник и объявить услугу непосредственно перед закрывающим тегом для ваших </приложений>:

<receiver android:name=".ConnMonitor" android:enabled="true"> 
     <intent-filter> 
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
     </intent-filter> 
    </receiver> 
    <service android:name=".BatchUploadGpsData" ></service> 

</application> 

создать класс широковещательного приемника в отдельном файл с именем ConnMonitor.java (пожалуйста, раскомментируйте Лог вызовов, чтобы иметь возможность должным образом контролировать поток)

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.util.Log; 

public class ConnMonitor extends BroadcastReceiver { 
    private String TAG = "TGtracker"; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     //String typeName = ""; 
     String state = ""; 
     int type = -1; 
     ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo test = (NetworkInfo) connectivityManager.getActiveNetworkInfo(); 
     //Log.v(TAG,"there has been a CONNECTION CHANGE -> "+intent.getExtras().get(ConnectivityManager.EXTRA_NETWORK_INFO)); 
     try { 
      //typeName = test.getTypeName().toString(); 
      type = test.getType(); 
      state = test.getState().toString(); 
      //Log.i(TAG,"type -> '"+typeName +"' state -> '"+state+"'" ); 
     } catch (Exception e) { 
      //typeName = "null"; 
      type = -1; 
      state = "DISCONNECTED"; 
      //Log.i(TAG,"type -> error1 "+e.getMessage()+ " cause = "+e.getCause() ); 
     } 

     if ((type == 1) && (state == "CONNECTED")) { 
      //Log.i(TAG, "I am soooo friggin uploadin on this beautiful WIFI connection "); 
      Intent batchUploadDataService = new Intent(context, BatchUploadGpsData.class); 
      context.startService(batchUploadDataService); 
     } else { 
      //Log.e(TAG,"NO FOUND MATCH type -> '"+typeName +"' state -> '"+state+"'" ); 
     } 
    } 
} 

и, наконец, создать сервис BatchUploadGpsData.java так:

import android.app.Service; 
import android.content.Intent; 
import android.os.IBinder; 
import android.util.Log; 

public class BatchUploadGpsData extends Service { 
    final String TAG = "TGtracker"; 

    @Override 
    public void onCreate() { 
     Log.e(TAG, "here i am, rockin like a hurricane. onCreate service"); 
    // this service tries to upload and terminates itself whether it is successful or not 
    // but it only effectively DOES anything while it is created 
    // (therefore, you can call 1 million times if uploading isnt done, nothing happens) 
    // if you comment this next line, you will be able to see that it executes onCreate only the first it is called 
    // the reason i do this is that the broadcast receiver is called at least twice every time you have a new change of connectivity state with successful connection to wifi 
     this.stopSelf(); 
    } 
    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     //Log.i(TAG, "Received start id " + startId + ": " + intent); 
     Log.e(TAG, "call me redundant BABY! onStartCommand service"); 
     // this service is NOT supposed to execute anything when it is called 
     // because it may be called inumerous times in repetition 
     // all of its action is in the onCreate - so as to force it to happen ONLY once 
     return 1; 
    } 
    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

} 

это не псевдокод, это фактический код, протестирована и работает на Android версии 2.2 и выше.

способ протестировать эту услугу - выключить и перезапустить службы WIFI на вашем Android-устройстве (отключение Wi-Fi-маршрутизатора также приведет к трюку). НО этот код не проверяет, действительно ли вы подключены к сети.для этого я рекомендую вам выполнить запрос httpclient и проверить результат вызова. выходит за рамки этого обсуждения.

ПРИМЕЧАНИЕ: поскольку службы работают в том же потоке, что и пользовательский интерфейс, я настоятельно рекомендую вам реализовать загрузку в отдельном потоке или асинтете, в зависимости от ваших конкретных потребностей. вы также можете запустить всю службу в отдельном потоке, но это еще раз не та область обсуждения, несмотря на стандартную практику в этих случаях.

2

Сначала вы должны добавить @Override перед тем onStartCommand(..) затем макияж что цель для Android-проекта выше 2 .0.

0

Прежде всего, называйте свой класс другим, это моя рекомендация избегать путаницы по линии. Во-вторых, это пример моего явного вызова службы, которая у меня есть. Я использую полные имена путей при вызове служб и т. Д., Поскольку они не находятся в том же пакете, что и мое приложение.

<service android:name="com.public.service.UploaderService" android:icon="@drawable/vgbio"></service> 

Вот суть моего класса обслуживания,

package com.public.service; 
.... 
public class UploaderService extends Service{ 
.... 
} 

В-третьих, что вы используете @Override к onStartCommand().

1

Я считаю, что вы не можете получить доступ к компонентам пользовательского интерфейса, таким как Dialog или даже Toast в сервисе.

попробуйте это.

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

/* Toast.makeText(this, "onStartCommand...", Toast.LENGTH_LONG).show(); 
    return 1; */ 

    Log.i("YourService", "Yes this works."); 
} 
3
  1. несвязанная служба: она работает в фоновом режиме на неопределенное время даже начала деятельность с обслуживанием заканчивается также.
  2. Bound Service: он будет работать до времени жизни.

Деятельность может начать обслуживание через startService(), и она остановится через stopService(). Если активность хочет взаимодействовать с сервисом, она может использовать bindService().

Первый onCreate() вызывается, после того как onStartCommand вызывается с данными о намерениях, предоставляемыми активностью.

Source