【问题标题】:bring Android activity to front from background thread将 Android 活动从后台线程带到最前面
【发布时间】:2011-10-18 02:27:36
【问题描述】:

我有一个通过 Intent 启动系统浏览器的活动。在此之前不久,我对其他 URL 进行了 HTTP GET。一旦用户在浏览器中完成他的任务(使用 OAuth 登录),该 GET 将立即得到答复。

我希望能够关闭浏览器和/或让我的应用程序的活动回到前面。

我不想使用 WebView,因为我想避免让人觉得我可能试图监视密码。

知道如何解决这个问题吗?有可能吗?

非常感谢!

丹尼尔

【问题讨论】:

  • 我认为,默认的浏览器实现会捕获返回键(返回到以前的站点),而不是从任务堆栈中删除浏览器活动(假设您没有通过 Intent 将浏览器作为新任务启动标志)。我也很好奇解决方案...
  • 这不是后台进程应该做的事情。而是创建一个用户可以随意响应的通知。

标签: android multithreading android-activity foreground


【解决方案1】:

确保 OAuth 打开类似于 yourapp://success 的 URL

接下来,您添加一个意图过滤器来处理此自定义协议和地址。更多详情在http://developer.android.com/guide/topics/intents/intents-filters.html#ifs

【讨论】:

    【解决方案2】:

    这就是我的项目中的诀窍。

    应用程序清单非常标准:

        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:launchMode="singleTask"
            android:screenOrientation="portrait" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
    

    这是后台线程的代码 sn-p,它发送意图以重新显示活动:

    public class AlarmThread extends Thread {
    
        private int mSleepTime;
    
        public AlarmThread(int sleepSeconds) {
            super("AlarmThread");
            mSleepTime = sleepSeconds * 1000;
        }
        @Override
        public void run() {
            Log.i("thread", "started sleeping for " + mSleepTime + " milliseconds");
            try {
                Thread.sleep(mSleepTime);
            } catch (InterruptedException e) {
                // ignored
            }
            Log.i("thread", "creating intent to bring activity to foreground");
            Intent intent = new Intent(MainActivity.getContext(), MainActivity.class);
            intent.setAction(Intent.ACTION_MAIN);
            intent.addCategory(Intent.CATEGORY_LAUNCHER);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            MainActivity.getContext().getApplicationContext().startActivity(intent);
        }
    }
    

    请注意,诀窍在于MainActivity.getContext().getApplicationContext().startActivity(intent); 部分(上面的最后一行)。

    在MainActivity中,我添加了getContext方法:

    public static Context getContext() {
        return mInstance;
    }
    

    并且成员'mInstance'是在'onCreate'中设置的:

    private static MainActivity mInstance = null;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        // Other code....
    
        mInstance = this;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 2019-11-22
      相关资源
      最近更新 更多