Allowing service time to start up

2019-08-28 16:54发布

问题:

I wish to enable automatic login to my app, yet the problem that is arising is that the service is being started and bound after the automatic login features are being called:

04-28 20:21:09.061    5427-5427/com.example.feastapp I/PersonaManager﹕ getPersonaService() name persona_policy
04-28 20:21:09.081    5427-5427/com.example.feastapp V/AUTO LOGIN TEST﹕ Waiting... 1/5 @ 268919454
04-28 20:21:14.086    5427-5427/com.example.feastapp V/AUTO LOGIN TEST﹕ Waiting... 2/5 @ 268924454
04-28 20:21:19.081    5427-5427/com.example.feastapp V/AUTO LOGIN TEST﹕ Waiting... 3/5 @ 268929454
04-28 20:21:24.096    5427-5427/com.example.feastapp I/PersonaManager﹕ getPersonaService() name persona_policy
04-28 20:21:24.176    5427-5427/com.example.feastapp V/TEST GCM Service Login﹕ Service is NULL
04-28 20:21:24.236    5427-5427/com.example.feastapp D/dalvikvm﹕ GC_FOR_ALLOC freed 244K, 17% free 6485K/7812K, paused 15ms, total 15ms
04-28 20:21:24.296    5427-5427/com.example.feastapp D/dalvikvm﹕ GC_FOR_ALLOC freed 1069K, 26% free 6881K/9260K, paused 9ms, total 10ms
04-28 20:21:24.376    5427-5427/com.example.feastapp D/libEGL﹕ loaded /system/lib/egl/libEGL_mali.so
04-28 20:21:24.381    5427-5427/com.example.feastapp D/libEGL﹕ loaded /system/lib/egl/libGLESv1_CM_mali.so
04-28 20:21:24.386    5427-5427/com.example.feastapp D/libEGL﹕ loaded /system/lib/egl/libGLESv2_mali.so
04-28 20:21:24.391    5427-5427/com.example.feastapp E/﹕ Device driver API match
    Device driver API version: 23
    User space API version: 23
04-28 20:21:24.391    5427-5427/com.example.feastapp E/﹕ mali: REVISION=Linux-r3p2-01rel3 BUILD_DATE=Mon Feb 10 15:44:10 KST 2014
04-28 20:21:24.446    5427-5427/com.example.feastapp D/OpenGLRenderer﹕ Enabling debug mode 0
04-28 20:21:24.506    5427-5427/com.example.feastapp V/Service﹕ The service is connected

I have the service startup in the extended application class to give the service time, yet it still starts after the auto log feature clause is called.

The loggingin class:

public class LoggingIn extends Activity {

    protected static final int NOT_CONNECTED_TO_SERVICE = 0;
    protected static final int FILL_BOTH_USERNAME_AND_PASSWORD = 1;
    public static final String AUTHENTICATION_FAILED = "0";
    public static final String FRIEND_LIST = "FRIEND_LIST";
    protected static final int MAKE_SURE_USERNAME_AND_PASSWORD_CORRECT = 2;
    protected static final int NOT_CONNECTED_TO_NETWORK = 3;
    private EditText usernameText;
    private EditText passwordText;

    private JSONObject resultObject;
    public static String userId = null;

    private Manager imService;
    public static final int SIGN_UP_ID = Menu.FIRST;
    public static final int EXIT_APP_ID = Menu.FIRST + 1;

    // For GCM
    String regid;
    GoogleCloudMessaging gcm;
    AtomicInteger msgId = new AtomicInteger();
    SharedPreferences prefs;
    Context context;

    public static final String EXTRA_MESSAGE = "message";
    public static final String PROPERTY_REG_ID = "registration_id";
    private static final String PROPERTY_APP_VERSION = "appVersion";
    private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;

    private ServiceConnection mConnection = new ServiceConnection() {
        public void onServiceConnected(ComponentName className, IBinder service) {
            imService = ((MessagingService.IMBinder) service).getService();
            Log.v("Service", "The service is connected");


            if (imService.isUserAuthenticated() == true) {
                // Intent i = new Intent(LoggingIn.this, ListOfFriends.class);
                Intent i = new Intent(LoggingIn.this, MainActivity.class);
                startActivity(i);
                LoggingIn.this.finish();
            }
        }

        public void onServiceDisconnected(ComponentName className) {
            Log.v("Service", "The service is disconnected");
            imService = null;
            Toast.makeText(LoggingIn.this, R.string.local_service_stopped,
                    Toast.LENGTH_SHORT).show();
        }
    };

    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
              /*
               * Start and bind the imService
               */
        bindService(new Intent(LoggingIn.this, MessagingService.class),
                mConnection, Context.BIND_AUTO_CREATE);


        // Initiate Volley:
        final RequestQueue requestQueue = VolleySingleton.getsInstance().getRequestQueue();

        //Remove title bar
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);

        //Remove notification bar
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

        // For auto logging in:
        if (!SaveSharedPreference.getUserName(getApplicationContext()).isEmpty()) {

            for (int i = 0; i < 3; i++) {
                Log.v("AUTO LOGIN TEST",
                        "Waiting... " + (i + 1) + "/5 @ "
                                + SystemClock.elapsedRealtime());
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                }

            }

            setContentView(R.layout.feast_loading_splash_page);

            final String userName = SaveSharedPreference.getUserName(getApplicationContext());

            final String password = SaveSharedPreference.getPassword(getApplicationContext());

            Log.v("TEST GCM Service Login", "SharedPref Username is " + userName + " and password " + password);

            if (imService == null) {
                Log.v("TEST GCM Service Login", "Service is NULL");
                Toast.makeText(getApplicationContext(),
                        R.string.not_connected_to_service,
                        Toast.LENGTH_LONG).show();
                // showDialog(NOT_CONNECTED_TO_SERVICE);
                //return;
            } else if (imService.isNetworkConnected() == false) {
                Log.v("TEST GCM Service Login", "imService.isNetworkConnected() == false");
                Toast.makeText(getApplicationContext(),
                        R.string.not_connected_to_network,
                        Toast.LENGTH_LONG).show();
                // showDialog(NOT_CONNECTED_TO_NETWORK);

            } else {

                Log.v("TEST GCM Service Login", "When imService is not null: SharedPref Username is " + userName + " and password " + password);

                Thread autoLoginThread = new Thread() {
                    private Handler handler = new Handler();

                    @Override
                    public void run() {
                        String result = null;

                        try {
                            result = imService.authenticateUser(
                                    userName.trim(),
                                    password.trim());
                        } catch (UnsupportedEncodingException e) {

                            e.printStackTrace();
                        }
                        if (result == null
                                || result.equals(AUTHENTICATION_FAILED)) {
                                      /*
                                       * Authenticatin failed, inform the user
                                       */
                            handler.post(new Runnable() {
                                public void run() {
                                    Toast.makeText(
                                            getApplicationContext(),
                                            R.string.make_sure_username_and_password_correct,
                                            Toast.LENGTH_LONG).show();

                                    // showDialog(MAKE_SURE_USERNAME_AND_PASSWORD_CORRECT);
                                }
                            });

                        } else {                                      /*
                                       * if result not equal to authentication failed,
                                       * result is equal to friend and group list of
                                       * the user 0: is for friends, 1: is for groups
                                       */

                            handler.post(new Runnable() {
                                public void run() {
                                    Intent i = new Intent(LoggingIn.this,
                                            MainActivity.class);
                                    startActivity(i);
                                    LoggingIn.this.finish();

                                }
                            });

                        }

                    }
                };
                autoLoginThread.start();

            }

        }

        setContentView(R.layout.loggin_in);
        setContentView(R.layout.feast_login_page);
        //setTitle("Login");

        ImageButton loginButton = (ImageButton) findViewById(R.id.button1);

        // So don't need to log in manually, just click the button
        usernameText = (EditText) findViewById(R.id.username);
        passwordText = (EditText) findViewById(R.id.password);

        loginButton.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {
                if (imService == null) {
                    Toast.makeText(getApplicationContext(),
                            R.string.not_connected_to_service,
                            Toast.LENGTH_LONG).show();
                    // showDialog(NOT_CONNECTED_TO_SERVICE);
                    return;
                } else if (imService.isNetworkConnected() == false) {
                    Toast.makeText(getApplicationContext(),
                            R.string.not_connected_to_network,
                            Toast.LENGTH_LONG).show();
                    // showDialog(NOT_CONNECTED_TO_NETWORK);

                } else if (usernameText.length() > 0
                        && passwordText.length() > 0) {

                    Thread loginThread = new Thread() {
                        private Handler handler = new Handler();

                        @Override
                        public void run() {
                            String result = null;

                            try {
                                result = imService.authenticateUser(
                                        usernameText.getText().toString().trim(),
                                        passwordText.getText().toString().trim());
                            } catch (UnsupportedEncodingException e) {

                                e.printStackTrace();
                            }
                            if (result == null
                                    || result.equals(AUTHENTICATION_FAILED)) {
                                      /*
                                       * Authenticatin failed, inform the user
                                       */
                                handler.post(new Runnable() {
                                    public void run() {
                                        Toast.makeText(
                                                getApplicationContext(),
                                                R.string.make_sure_username_and_password_correct,
                                                Toast.LENGTH_LONG).show();

                                        // showDialog(MAKE_SURE_USERNAME_AND_PASSWORD_CORRECT);
                                    }
                                });

                            } else {

                                      /*
                                       * if result not equal to authentication failed,
                                       * result is equal to friend and group list of
                                       * the user 0: is for friends, 1: is for groups
                                       */
                                handler.post(new Runnable() {
                                    public void run() {

                                        // If log in successful, then save
                                        // username and password to shared
                                        // preferences:

                                        SaveSharedPreference.setUserName(
                                                getApplicationContext(),
                                                usernameText.getText()
                                                        .toString());

                                        SaveSharedPreference.setPassword(
                                                getApplicationContext(),
                                                passwordText.getText()
                                                        .toString());

                                        Intent i = new Intent(LoggingIn.this,
                                                MainActivity.class);
                                        startActivity(i);
                                        LoggingIn.this.finish();

                                    }
                                });

                            }

                        }
                    };
                    loginThread.start();

                } else {
                          /*
                           * Username or Password is not filled, alert the user
                           */
                    Toast.makeText(getApplicationContext(),
                            R.string.fill_both_username_and_password,
                            Toast.LENGTH_LONG).show();
                    // showDialog(FILL_BOTH_USERNAME_AND_PASSWORD);
                }

                // GET the users id!!
                JsonObjectRequest getUserId = new JsonObjectRequest(Request.Method.GET,
                        "http://" + Global.getFeastOnline() + "/getUserData/" + usernameText.getText().toString() + ".json", ((String) null),
                        new Response.Listener<JSONObject>() {
                            @Override
                            public void onResponse(JSONObject response) {

                                // Parse the JSON:
                                try {
                                    resultObject = response.getJSONObject("userInfo");
                                    userId = resultObject.getString("id");

                                    Log.v("USER ID", "The user id is " + userId);

                                } catch (JSONException e) {
                                    e.printStackTrace();
                                }

                            }
                        },
                        new Response.ErrorListener() {
                            @Override
                            public void onErrorResponse(VolleyError error) {
                                Log.d("Error.Response", error.toString());
                            }
                        });

                requestQueue.add(getUserId);

            }
        });
    }

    @Override
    protected Dialog onCreateDialog(int id) {
        int message = -1;
        switch (id) {
            case NOT_CONNECTED_TO_SERVICE:
                message = R.string.not_connected_to_service;
                break;
            case FILL_BOTH_USERNAME_AND_PASSWORD:
                message = R.string.fill_both_username_and_password;
                break;
            case MAKE_SURE_USERNAME_AND_PASSWORD_CORRECT:
                message = R.string.make_sure_username_and_password_correct;
                break;
            case NOT_CONNECTED_TO_NETWORK:
                message = R.string.not_connected_to_network;
                break;
            default:
                break;
        }

        if (message == -1) {
            return null;
        } else {
            return new AlertDialog.Builder(LoggingIn.this)
                    .setMessage(message)
                    .setPositiveButton(R.string.OK,
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,
                                                    int whichButton) {
                                                    /* User clicked OK so do some stuff */
                                }
                            }).create();
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        unbindService(mConnection);
    }

    @Override
    protected void onResume() {
        super.onResume();

        bindService(new Intent(LoggingIn.this, MessagingService.class),
                mConnection, Context.BIND_AUTO_CREATE);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        boolean result = super.onCreateOptionsMenu(menu);

        menu.add(0, SIGN_UP_ID, 0, R.string.sign_up);
        menu.add(0, EXIT_APP_ID, 0, R.string.exit_application);

        return result;
    }

    @Override
    public boolean onMenuItemSelected(int featureId, MenuItem item) {

        switch (item.getItemId()) {
            case SIGN_UP_ID:
                Intent i = new Intent(LoggingIn.this, SigningUp.class);
                startActivity(i);
                return true;
            case EXIT_APP_ID:

                return true;
        }

        return super.onMenuItemSelected(featureId, item);
    }

}

回答1:

I posted the auto login code within the ServiceConnection block. The issue was that the service is connected only after the onCreate block, therefore it was always NULL when calling anything against it.

private ServiceConnection mConnection = new ServiceConnection() {
        public void onServiceConnected(ComponentName className, IBinder service) {
            imService = ((MessagingService.IMBinder) service).getService();
            Log.v("Service", "The service is connected");

            // Allowing autologin!!**********************************************************
            final String userName = SaveSharedPreference.getUserName(getApplicationContext());

            final String password = SaveSharedPreference.getPassword(getApplicationContext());

            Log.v("TEST GCM Service Login", "SharedPref Username is " + userName + " and password " + password);

            //Log.v("TEST GCM Service Login", "The value of imService is: " + imService.toString());

            if (imService == null) {
                Log.v("TEST GCM Service Login", "Service is NULL");
                Toast.makeText(getApplicationContext(),
                        R.string.not_connected_to_service,
                        Toast.LENGTH_LONG).show();
                // showDialog(NOT_CONNECTED_TO_SERVICE);
                //return;
            } else if (imService.isNetworkConnected() == false) {
                Log.v("TEST GCM Service Login", "imService.isNetworkConnected() == false");
                Toast.makeText(getApplicationContext(),
                        R.string.not_connected_to_network,
                        Toast.LENGTH_LONG).show();
                // showDialog(NOT_CONNECTED_TO_NETWORK);

            } else {

                Log.v("TEST GCM Service Login", "When imService is not null: SharedPref Username is " + userName + " and password " + password);

                Thread autoLoginThread = new Thread() {
                    private Handler handler = new Handler();

                    @Override
                    public void run() {
                        String result = null;

                        try {
                            result = imService.authenticateUser(
                                    userName.trim(),
                                    password.trim());
                        } catch (UnsupportedEncodingException e) {

                            e.printStackTrace();
                        }
                        if (result == null
                                || result.equals(AUTHENTICATION_FAILED)) {
                                      /*
                                       * Authenticatin failed, inform the user
                                       */
                            handler.post(new Runnable() {
                                public void run() {
                                    Toast.makeText(
                                            getApplicationContext(),
                                            R.string.make_sure_username_and_password_correct,
                                            Toast.LENGTH_LONG).show();

                                    // showDialog(MAKE_SURE_USERNAME_AND_PASSWORD_CORRECT);
                                }
                            });

                        } else {                                      /*
                                       * if result not equal to authentication failed,
                                       * result is equal to friend and group list of
                                       * the user 0: is for friends, 1: is for groups
                                       */

                            handler.post(new Runnable() {
                                public void run() {
                                    Intent i = new Intent(LoggingIn.this,
                                            MainActivity.class);
                                    startActivity(i);
                                    LoggingIn.this.finish();

                                }
                            });

                        }

                    }
                };
                autoLoginThread.start();

            }

            if (imService.isUserAuthenticated() == true) {
                // Intent i = new Intent(LoggingIn.this, ListOfFriends.class);
                Intent i = new Intent(LoggingIn.this, MainActivity.class);
                startActivity(i);
                LoggingIn.this.finish();
            }
        }

        public void onServiceDisconnected(ComponentName className) {

            Log.v("Service", "The service is disconnected");
            imService = null;
            Toast.makeText(LoggingIn.this, R.string.local_service_stopped,
                    Toast.LENGTH_SHORT).show();
        }
    };