簡體   English   中英

如何將服務對象傳遞給Android中的子類?

[英]How to pass service object to subclass in Android?

我正在開發一個應用程序,該應用程序從Web獲取數據並將其寫回到Web。 為此,我使用了AsyncTask,但是這些請求並未進行優化,因此我必須對每個請求進行用戶身份驗證。 現在,我想使用Service來保持與后端的連接並執行請求,而無需在每個請求上都對用戶進行身份驗證。

我無法將此服務對象發送給子活動,而又沒有創建新實例並使該服務所需的所有值都為零的麻煩。 那么如何在不損失價值的情況下做到這一點呢?

這是我的服務:

public class LasteMVService extends Service {

    private ArrayList<WorkSheet> workSheetArrayList;
    private SpreadSheet selectedSpeadSheet;
    private static String LOG_TAG = "LasteMVService";
    private IBinder mBinder = new MyBinder();


    @Override
    public void onCreate() {
        super.onCreate();
        new Thread(new Task()).start();

        Log.v(LOG_TAG, "in onCreate");

    }


    @Override
    public IBinder onBind(Intent intent) {
        Log.v(LOG_TAG, "in onBind");
        return mBinder;
    }

    @Override
    public void onRebind(Intent intent) {
        Log.v(LOG_TAG, "in onRebind");
        super.onRebind(intent);

    }


    public SpreadSheet getSelectedSpeadSheet() {
        return selectedSpeadSheet;
    }

    public ArrayList<WorkSheet> getWorkSheetArrayList() {
        return workSheetArrayList;
    }

    @Override
    public void onDestroy() {
        Log.v(LOG_TAG, "in onDestroy");
        super.onDestroy();
    }

    public class MyBinder extends Binder {
        public LasteMVService getService() {
            return LasteMVService.this;
        }
    }

    class Task implements Runnable {

        @Override
        public void run() {
            synchronized (this){
            AndroidAuthenticator androidAuthenticator = new AndroidAuthenticator(getApplicationContext());
            SpreadSheetFactory spf = SpreadSheetFactory.getInstance(androidAuthenticator);
            ArrayList<SpreadSheet> sheets = spf.getSpreadSheet("Stardiprotokoll", true);
            if (sheets != null) {
                final SpreadSheet spreadSheet = sheets.get(0);
                selectedSpeadSheet = spreadSheet;
                ArrayList<WorkSheet> workSheet = spreadSheet.getAllWorkSheets();
                workSheetArrayList = workSheet;
            }
        }
        }
    }
}

這是我與BaseActivity綁定的地方:

public class BaseActivity extends AppCompatActivity {


        protected LasteMVService lasteMVService;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            lasteMVService = ((LasteMVApplication) getApplicationContext()).getLasteMVService();
            if(lasteMVService == null){
                ((LasteMVApplication) getApplicationContext()).initApp();
                lasteMVService = ((LasteMVApplication) getApplicationContext()).getLasteMVService();
                Util.restartApp(this, true);
            }


        }

        @Override
        protected void onStart() {
            super.onStart();
            Intent intent = new Intent(BaseActivity.this,LasteMVService.class);
            startService(intent);
bindService(intent,serviceConnection,BIND_AUTO_CREATE);


        }
      protected ServiceConnection serviceConnection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                LasteMVService.MyBinder myBinder = (LasteMVService.MyBinder) service;
                lasteMVService = myBinder.getService();

            }

            @Override
            public void onServiceDisconnected(ComponentName name) {

            }

        };

我的問題是如何在BaseActivity的某些子活動中獲取相同的服務實例?

好的,因此您需要一個服務對象,即從基礎活動中獲取該對象的引用,而不是創建一個在整個應用程序中可全局訪問的單例類。幫助您的源代碼如下

public class Common extends Application {

private Service mService; //Service Object from your class that extends service.
private Context mContext;

public Service getService(){
    return mService;
}
public void setService(Service service){
    mService = service;
}



@Override
public void onCreate() {
    super.onCreate();
    //Gets the context associated with the whole application
    mContext = getApplicationContext();
}
}


public class Service extends Service{

private Common mApp;
private Context mContext;


//Instantiate the Common Object from the singleton class within on create.
@Override
public void onCreate() {
    super.onCreate();
    mContext = getApplicationContext();

    mApp = (Common) getApplicationContext();
    mApp.setService(this);

    }

 }

  //Now to use it in your base Activity

public class BaseActivity extends AppCompatActivity{

private Common mApp;
private Service mService;

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mApp = (Common) mContext.getApplicationContext();

        //To use the service you would simply use:

        mService = mApp.getService()./*Some public method defined in your service*/;



    }


}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM