问题描述
我在主要活动中进行登录。 如果登录正确,我想查看我的配置文件并从服务器下载一些数据,但是如果更改活动,则无法保持连接。
我怎样才能做到这一点?
1楼
一旦确认登录正确(通过测试与服务器的连接并进行身份验证),就可以将登录详细信息存储在SharedPreferences或类似内容中。
然后,您可以使用这些登录详细信息进行后续请求(无论您处于哪个活动中)。 当然,这是假设服务器以这种方式接受身份验证。
2楼
我想知道为什么您需要保持连接。 也许您可以重新打开连接并再次登录?
但是,如果您确实需要保持连接打开:您可以在应用程序中保持连接。 但是请确保当用户离开您的应用程序时关闭连接! 我真的不推荐这个。 或设置超时以关闭连接,例如闲置5分钟后。
您将不得不在AndroidManifest中说出您的应用使用哪个应用。 (请参见andriod:name)。
然后,您可以通过以下方法从活动中获取应用程序:getApplication()。 不要忘记投下它。 比添加可以登录的功能等等。
编辑:
更详细一点:
您将必须创建一个扩展Application的类。 您在清单中应用程序的android:name中输入的此类的名称。 在该类中,您编写用于处理连接的函数。 像:startConnection()doLogin()stopConnection()...在“活动”中您调用:
NameOfYouApplication app = (NameOfYouApplication) getApplication();
app.startConnection();
app.doLogin();
有点像 但是请注意,即使活动已关闭,您的应用程序也仍然有效。 您最好找到关闭连接的好时机。
3楼
您也可以使用 。 服务是活动中长期运行的后台任务。
在登录表单中,您可以发送类似于开始新活动的startService意图。
这将调用Service类上的onStartCommand
,您可以在其中创建连接并将其存储在Service对象本身中。
当您需要来自连接的信息时,可以使用bindService
调用获取服务实例。
以下是改编自Google基本示例的基本登录服务的示例。
public class LocalService extends Service {
private MyConnection conn;
/**
* Class for clients to access. Because we know this service always
* runs in the same process as its clients, we don't need to deal with
* IPC.
*/
public class LocalBinder extends Binder {
LocalService getService() {
return LocalService.this;
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Intent i = new Intent("my.service.connected");
try {
conn = new MyConnection(
intent.getStringExtra("username"),
intent.getStringExtra("password"));
i.putExtra("succeeded", true);
sendBroadcast(i);
} catch (ConnectionException ex) {
i.putExtra("succeeded", false);
sendBroadcast(i);
}
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
// This is the object that receives interactions from clients. See
// RemoteService for a more complete example.
private final IBinder mBinder = new LocalBinder();
}
Android.Manifest.xml还需要在<application />
<service android:name="LocalService"></service>
元素。
服务并非没有缺点。 通常,您应该在Intent中传递启动参数,这意味着它们需要可序列化或可打包。 这样可以防止您在“活动”中创建连接,检查登录是否成功并将其发送给服务。*相反,您需要将登录参数发送到服务并在其中执行登录。
当您需要确定连接是否成功,应该继续进行下一个活动还是失败并且应该显示错误消息时,就会出现复杂情况。 有几种解决方案,但所有解决方案都需要进行一些设置。 特别是当您认为用户可能会在按“登录”和实际登录之间暂停您的活动。
如上所示,一种选择是通过发送来自服务的广播来通知活动。 以下是启动上述服务并收听广播的活动。 以下活动未考虑该活动随时可能暂停的可能性。
public class LoginActivity extends Activity {
class MyReceiver extends BroadcastReceiver {
@Override
public final void onReceive(Context ctx, Intent i) {
if (i.getBooleanExtra("succeeded", false)) {
startMyMainActivity();
} else {
showErrorMessage();
}
}
}
private BroadcastReceiver bcReceiver;
private void doLogin(String username, String password) {
// Register receiver that listens for connected messages.
bcReceiver = new MyReceiver();
IntentFilter ifilter = new IntentFilter("my.service.connected");
registerReceiver(bcReceiver, ifilter);
// Send command to start service (connects)
Intent i = new Intent(this, LocalService.class);
i.putExtra("username", username);
i.putExtra("password", password);
startService(i);
}
@Override
protected void onPause() {
if (bcReceiver != null) unregisterReceiver(bcReceiver);
super.onPause();
}
}
当“活动”应正常处理暂停的活动时,应在共享变量中跟踪其状态。 如果它以前处于跟踪服务的状态,则应绑定到服务并在恢复时检查其状态。 如果服务仍在连接(而不是连接或断开连接),则应重新注册广播侦听器。