我希望启用自动登录我的应用程序,但出现的问题是在调用自动登录功能后,服务正在启动和绑定:
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
我在扩展应用程序类中具有服务启动以提供服务时间,但它仍然在调用自动日志功能子句后启动。
日志记录类:
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);
}
}
我在ServiceConnection
块中发布了自动登录代码。问题是该服务仅在 onCreate 块之后连接,因此在调用任何针对它的内容时,它始终为 NULL。
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();
}
};