2014-07-05 149 views
0

我對安卓服務有問題 當我關閉應用程序時,主要活動關閉並且服務被重新創建 - 創建方法 自動調用並且onstart也被稱爲自動 - 所有狀態都是不見了。當主要活動被破壞時重新創建Android服務

這是我的活動代碼

public class ServicesDemo extends Activity implements OnClickListener 
{ 
    private static final String TAG = "ServicesDemo"; 
    Button buttonStart, buttonStop; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     if (savedInstanceState != null) 
     { 
      Log.d(TAG, "ServicesDemo:onCreate WITH savedInstanceState)"); 
     } 
     Log.d(TAG, "ServicesDemo:onCreate"); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     buttonStart = (Button) findViewById(R.id.buttonStart); 
     buttonStop = (Button) findViewById(R.id.buttonStop); 

     buttonStart.setOnClickListener(this); 
     buttonStop.setOnClickListener(this); 
    } 

    public void onClick(View src) 
    { 
     switch (src.getId()) 
     { 
     case R.id.buttonStart: 
      Log.d(TAG, "onClick: starting srvice"); 
      startService(new Intent(this, MyService.class)); 
      break; 
     case R.id.buttonStop: 
      // Log.d(TAG, "onClick: stopping srvice"); 

      stopService(new Intent(this, MyService.class)); 
      break; 
     } 
    } 
} 

這是服務代碼:

public class MyService extends Service 
{ 
    private static final String TAG = "ServicesDemo"; 
    private static MyThread t = new MyThread(); 
    static int yy = 90; 

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

    @Override 
    public void onCreate() 
    { 
     Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show(); 
     Log.d(TAG, "onCreate"); 
     // MockGPSLocationModel.getInstance().Counter++; 

     // Log.d(TAG, "MockGPSLocationModel.getInstance().Counter :: " + 
     // MockGPSLocationModel.getInstance().Counter); 
     // MockGPSLocationModel.getInstance().Counter++; 
    } 

    static public class MyThread extends Thread 
    { 
     MediaPlayer player; 
     public Context ctx; 

     @Override 
     public void run() 
     { 
      try 
      { 
       for (int i = 0; i < 100; i++) 
       { 
        Log.i(TAG, "lOOP - " + i); 
        Thread.sleep(2000); 
       } 
       player = MediaPlayer.create(ctx, R.raw.braincandy); 
       player.setLooping(false); // Set looping 
       player.start(); 
      } 
      catch (Exception e) 
      { 
       Log.e(TAG, e.toString()); 

      } 
      finally 
      { 

      } 
     } 
    } 

    @Override 
    public void onDestroy() 
    { 
     Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show(); 
     Log.d(TAG, "onDestroy"); 
     // player.stop(); 
    } 

    @Override 
    public void onStart(Intent intent, int startid) 
    { 
     Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show(); 
     Log.d(TAG, "onStart"); 

     t.ctx = this; 
     t.start(); 

     // player.start(); 
    } 
} 

AndroidManifest.xml中

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

    <application 
     android:icon="@drawable/icon" 
     android:label="@string/app_name" > 
     <activity 
      android:name=".ServicesDemo" 
      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=".MyService" 
      android:enabled="true" /> 
    </application> 

    <uses-sdk android:minSdkVersion="3" /> 

</manifest> 

請幫助。 我堅持了那3天。

THX, 阿龍

回答

0

看看這有助於 - 使用共享偏好節省一些字符串的狀態,並檢索回來時重新開放的活動。

+0

我想避免使用持久性,因爲據我所知,服務實例不假設要銷燬直到停止服務調用,是不是這樣? – Aloni

0

使用這種方法在服務類

@Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     // We want this service to continue running until it is explicitly 
     // stopped, so return sticky. 

     // do your logic here not in onStart(). 

     return START_NOT_STICKY; 
    } 

START_NOT_STICKY和START_STICKY

這裏漂亮的答案START_NOT_STICKY和START_STICKY

https://stackoverflow.com/a/9441795/942224

,如果你想停止服務時,應用比在0中使用stopService更接近

+0

當我這樣做時,服務在活動結束時被銷燬。 – Aloni

+0

從onDestroy中刪除stopService。所以如果你從最新版本中刪除應用程序,服務將被破壞 –

1

您的代碼的第一個問題是您允許多次啓動MyServcie類中的線程。每個用戶按下「開始」按鈕時,線程start方法被調用,根據Java API specification這是違法的:

這是從來沒有的法律,以啓動一個線程不止一次。特別是,線程一旦完成執行就不會重新啓動。

您應該防止重複啓動您的Service類中的線程,例如通過使用標誌來告訴線程是否已啓動。

另請注意,Service#onStart方法自API級別5開始被棄用。相反,如果可能,應該使用Service#onStartCommand。 如Sanket指出的那樣,如果您只想執行一次MyThread#run方法的代碼,則應該返回START_NOT_STICKY。你也可能想明確地停止finally塊中的服務。

相關問題