当前位置: 代码迷 >> Android >> 如何保持登录抛出活动?
  详细解决方案

如何保持登录抛出活动?

热度:24   发布时间:2023-08-04 10:39:17.0

我在主要活动中进行登录。 如果登录正确,我想查看我的配置文件并从服务器下载一些数据,但是如果更改活动,则无法保持连接。

我怎样才能做到这一点?

一旦确认登录正确(通过测试与服务器的连接并进行身份验证),就可以将登录详细信息存储在SharedPreferences或类似内容中。

然后,您可以使用这些登录详细信息进行后续请求(无论您处于哪个活动中)。 当然,这是假设服务器以这种方式接受身份验证。

我想知道为什么您需要保持连接。 也许您可以重新打开连接并再次登录?

但是,如果您确实需要保持连接打开:您可以在应用程序中保持连接。 但是请确保当用户离开您的应用程序时关闭连接! 我真的不推荐这个。 或设置超时以关闭连接,例如闲置5分钟后。

您将不得不在AndroidManifest中说出您的应用使用哪个应用。 (请参见andriod:name)。

然后,您可以通过以下方法从活动中获取应用程序:getApplication()。 不要忘记投下它。 比添加可以登录的功能等等。

编辑:

更详细一点:

您将必须创建一个扩展Application的类。 您在清单中应用程序的android:name中输入的此类的名称。 在该类中,您编写用于处理连接的函数。 像:startConnection()doLogin()stopConnection()...在“活动”中您调用:

NameOfYouApplication app = (NameOfYouApplication) getApplication();
app.startConnection();
app.doLogin();

有点像 但是请注意,即使活动已关闭,您的应用程序也仍然有效。 您最好找到关闭连接的好时机。

您也可以使用 。 服务是活动中长期运行的后台任务。

在登录表单中,您可以发送类似于开始新活动的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();
    }
}

当“活动”应正常处理暂停的活动时,应在共享变量中跟踪其状态。 如果它以前处于跟踪服务的状态,则应绑定到服务并在恢复时检查其状态。 如果服务仍在连接(而不是连接或断开连接),则应重新注册广播侦听器。

  相关解决方案