从服务获取或访问对象

时间:2015-03-15 13:04:14

标签: android

在按下按钮时从登录活动中运行以下服务:

public class PlayerService extends Service{

    private StorageApi api;
    private String user, password, host = "****";
    private Intent i;

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

        i = intent;
        user = intent.getStringExtra("User");
        password = intent.getStringExtra("Pass");

        new connectStorage().execute();

        return startId;
    }
    @Override
    public void onDestroy() {

    }

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

    private class connectStorage extends AsyncTask<Void, Void, Boolean> {
        @Override
        protected Boolean doInBackground(Void... params) {
            try {

                api = DefaultClientFactory.create(host, user, password);
                Log.i("TEST",""+api.getUserInfo());
                return true;
            } catch (StorageApiException e) {
                e.printStackTrace();
                Log.i("TEST", "" + e.getMessage());

                return false;
            }
        }

        @Override
        protected void onPostExecute(Boolean result) {
            super.onPostExecute(result);

            if(result == false){
//                progressGenerator.finnish(btnSignIn);
//                btnSignIn.setProgress(-1);
                Toast.makeText(getApplicationContext(), "Invalid E-mail or Password !", Toast.LENGTH_SHORT).show();
            }
            else
            {
                Intent myIntent = new Intent(PlayerService.this, musicPlayer.class);
                myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                getApplicationContext().startActivity(myIntent);

            }
        }
    }
}

正如您在连接到api后在Asynctask中看到的那样,我使用

            Log.i("TEST",""+api.getUserInfo());

getUserInfo方法,我得到用户名,姓名,姓氏,电子邮件等信息......

执行此操作后,onPostExecute我将活动切换到另一个屏幕。我的问题是,如何在初始化连接后使用API​​对象,例如获取另一个活动的用户信息?

2 个答案:

答案 0 :(得分:1)

您可以将对象Parcelable设为:

ublic class StorageApi implements Parcelable{
    private String userInfo;
...

然后你必须覆盖该类中的writeToParcel(Parcel dest, int flags)方法。

然后你可以将你的对象发送到另一个这样的活动:

intent.putExtra("api", new StorageApi (api.getUserInfo(), ...));

有关详细信息,您可以查看this question它会为您提供一个很好的示例。

答案 1 :(得分:1)

您可以将api.getUserInfo()的内容存储在字符串中,然后通过intent将字符串传递给您想要切换的活动。 对于你的代码中的ex,你可以写

@Override
        protected void onPostExecute(Boolean result) {
            super.onPostExecute(result);

            if(result == false){
//                progressGenerator.finnish(btnSignIn);
//                btnSignIn.setProgress(-1);
                Toast.makeText(getApplicationContext(), "Invalid E-mail or Password !", Toast.LENGTH_SHORT).show();
            }
            else
            {
                Intent myIntent = new Intent(PlayerService.this, musicPlayer.class);
                myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                myIntent.putExtra("apiInfo", api.getUserInfo());
                getApplicationContext().startActivity(myIntent);

            }
        }

然后在您的其他活动中,您可以通过

获取此api信息
@Override
    protected void onCreate(Bundle savedInstanceState) {
        String apiInfo;
        super.onCreate(savedInstanceState);
        Intent i = getIntent();
        //If api.getUserInfo() returns a String
        apiInfo = i.getStringExtra("apiInfo");
        //If api.getUserInfo() returns a String Array
        apiInfo = i.getStringArrayExtra("apiInfo");



    }