android - Intent 的 OnDestroy()

标签 android android-intent google-drive-api

我正在从 googledrive 示例转换为可以更轻松地处理它的类。
在这个例子中,它调用了一个返回 Intent 的方法(这个 Intent 用于选择谷歌账户)。
主 Activity 调用 startActivityForResult(intent)。并在 onActivityResult 上检查 session 和登录。
googledrive 示例

public class GoogleActivity extends Activity {
    static final int REQUEST_ACCOUNT_PICKER = 1;
    static final int REQUEST_AUTHORIZATION = 2;
    static final int CAPTURE_IMAGE = 3;

    private static Uri fileUri;
    private static Drive service;
    private GoogleAccountCredential credential;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        credential = GoogleAccountCredential.usingOAuth2(this, DriveScopes.DRIVE);
       //Start account picker here (the intent I've told above)
        startActivityForResult(credential.newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER);
      //credential.newChooseAccountIntent() return an intent that can choose google account
    }

    @Override
    protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
        switch (requestCode) {
        case REQUEST_ACCOUNT_PICKER:
                    //Process it when intent exit
            if (resultCode == RESULT_OK && data != null && data.getExtras() != null) {
                String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
                if (accountName != null) {
                    credential.setSelectedAccountName(accountName);
                    service = getDriveService(credential);
                    startCameraIntent();
                }
            }
            break;
        case REQUEST_AUTHORIZATION:
            if (resultCode == Activity.RESULT_OK) {
                saveFileToDrive();
            } else {
                startActivityForResult(credential.newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER);
            }
            break;
        case CAPTURE_IMAGE:
            if (resultCode == Activity.RESULT_OK) {
                saveFileToDrive();
            }
        }
    }

    private void startCameraIntent() {
        String mediaStorageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath();
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(new Date());
        fileUri = Uri.fromFile(new java.io.File(mediaStorageDir + java.io.File.separator + "IMG_" + timeStamp + ".jpg"));

        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
        startActivityForResult(cameraIntent, CAPTURE_IMAGE);
    }

    private void saveFileToDrive() {
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    // File's binary content
                    java.io.File fileContent = new java.io.File(fileUri.getPath());
                    FileContent mediaContent = new FileContent("image/jpeg", fileContent);

                    // File's metadata.
                    File body = new File();
                    body.setTitle(fileContent.getName());
                    body.setMimeType("image/jpeg");

                    File file = service.files().insert(body, mediaContent).execute();
                    if (file != null) {
                        showToast("Photo uploaded: " + file.getTitle());
                        startCameraIntent();
                    }
                } catch (UserRecoverableAuthIOException e) {
                    startActivityForResult(e.getIntent(), REQUEST_AUTHORIZATION);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
        t.start();
    }

    private Drive getDriveService(GoogleAccountCredential credential) {
        return new Drive.Builder(AndroidHttp.newCompatibleTransport(), new GsonFactory(), credential).build();
    }

    public void showToast(final String toast) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(getApplicationContext(), toast, Toast.LENGTH_SHORT).show();
            }
        });
    }
}

现在我想创建一个类来处理 googledrive 的某些功能,包括登录。我的 Login() 方法处理所有关于登录的事情。
我可以在主要 Activity 之外调用帐户选择器 Intent ,但我无法处理该 Intent 退出/销毁的时间。
我的课是这样的:

public class GoogleHandler {
    Activity act;

    public GoogleHandler(Activity act) {
        this.act = act;
    }

    public void Login() {
            //start 
        act.startActivity(intent, requestCode);
    }
    // And then, how to handle when intent exit ??
}

任何建议也对我有帮助。

最佳答案

您传递给 startActivity() 的 Intent 永远不会开始或结束。这不是 Intent 所做的; Intent 启动另一个 Activity (或服务),然后开始并结束。

当 Google Account Picker Activity 完成时,将调用调用 Activity 的 onActivityResult() 方法。在您的示例中,act 收到对 onActivityResult() 的调用。您可以在您发布的 Google 云端硬盘示例代码中查看如何正确使用结果的示例。

为了正确接收此回调,act Activity 必须覆盖 onActivityResult()。您不能在 Login() 方法或 GoogleHandler 类中执行此操作,除非您将 GoogleHandler 更改为 Activity。

关于android - Intent 的 OnDestroy(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17714378/

相关文章:

google-api - 从 Google Drive API 获取操作项列表

android - 使用 libgdx 播放动画 gif

android - 在设备上打开屏幕

java - 使用 Intent.ACTION_OPEN_DOCUMENT 从特定文件夹打开文件

android - 如何生成产品链接?

pdf - 如何使用 Apps 脚本访问 Google Drive 上受密码保护的 PDF 文件

php - 如何使用 Google Drive 获取文件修改日期

android - RecyclerView 滚动到顶部,AsyncListDiffer 不起作用

java - 将历史记录存储在数据库中

android - 更好地理解使用 Google Places Api