为什么在新线程中启动意图不适用于真实设备

时间:2016-03-03 12:50:36

标签: android android-intent

我有一项活动申请 我希望它始终打开,所以当它停止时,30秒后应用程序再次打开。
这是我的代码:

onCreate函数中的

p = PreferenceManager.getDefaultSharedPreferences(this);
    p.edit().putBoolean("isRunning",true).commit();
onResume函数中的

p = PreferenceManager.getDefaultSharedPreferences(this);
    p.edit().putBoolean("isRunning",true).commit();
onStop函数中的

final MainActivity mainActivity = this;
p = PreferenceManager.getDefaultSharedPreferences(this);
        p.edit().putBoolean("isRunning",false).commit();
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(30000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (!p.getBoolean("isRunning", false)) {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(mainActivity, "starting intent", Toast.LENGTH_LONG).show();
                        }
                    });
                    Intent intent = new Intent(mainActivity, MainActivity.class);
                    startActivity(intent);
                }
            }
        }).run();

在我的模拟器上,代码运行完美,但是当我在真实设备上运行它时,我得到了“开始意图”,但实际上它仍然存在于其他活动中。

我的设备上安装了appLock应用程序 - 是否已连接?

更新

我希望它清楚:逻辑中没有问题,因为在模拟器中工作。

我的问题是在真实设备上它不起作用。

我得到了吐司,但没有发生startintent。

4 个答案:

答案 0 :(得分:0)

在MainActivity中创建Handler

Handler handler = new Handler(){
    public void handleMessage(Message m){
        Intent intent = new Intent(mainActivity, MainActivity.class);
        startActivity(intent);
        Toast.makeText(mainActivity, "starting intent", Toast.LENGTH_LONG).show();
    }
};

然后向线程内的处理程序发送一条消息,如下所示,

handler.sendMessage(1);

所以你的代码将成为,

if (!p.getBoolean("isRunning", false)) {
    hander.sendMessage(1);
}

答案 1 :(得分:0)

使用Handler启动安全内线程的活动:

Handler myHandler = new Handler(){
 public void handleMessage(Message m){
      Intent intent = new Intent(mainActivity, MainActivity.class);
      startActivity(intent);
  }
};

内部线程调用myHandler如下:

final MainActivity mainActivity = this;
p = PreferenceManager.getDefaultSharedPreferences(this);
        p.edit().putBoolean("isRunning",false).commit();
        new Thread(new Runnable() {
            @Override
            public void run() {

                if (!p.getBoolean("isRunning", false)) {

                      myHandler.sendEmptyMessageDelayed(0, 3000);  //delay 3000ms and send message to handler to start intent                  

                }
            }
 }).run();

答案 2 :(得分:0)

您正在尝试在调用OnStop时启动相同的活动。尝试这样做是违法的,因为你要阻止活动被阻止

答案 3 :(得分:0)

我有简单而有效的解决方案。我在设备上测试它并且工作得很好。

我做了什么。创建一个应用程序活动,在您的活动停止时请求应用程序活动在延迟后重新启动它:)

这是我的工作代码:)

package com.example.sandeepbhandari.myapplication;

import android.app.Application;
import android.content.Intent;
import android.os.Handler;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * Created by sandeepbhandari on 3/3/16.
 */
public class AppService extends Application{
    private static AppService sInstance;
    public static boolean isUserActivityRunning=false;

    private static final ScheduledExecutorService worker = Executors.newSingleThreadScheduledExecutor();

    public void startUserActivity(){
        if(!isUserActivityRunning) {
            Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    if(!PreferenceManager.getDefaultSharedPreferences(AppService.this).getBoolean("isRunning",false))
                    {
                        Intent userActivity = new Intent(getApplicationContext(), MainActivity.class);
                        userActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        getApplicationContext().startActivity(userActivity);
                    }
                }
            }, 30000);
        }
    }

    @Override
    public void onCreate() {
        super.onCreate();
        PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean("isRunning",true).commit();
        sInstance = this;
    }

    public static AppService getInstance() {
        return sInstance;
    }
}

为了使用它,请按以下方式更新清单文件

<application
        android:name=".AppService" //your application activity name

在您的活动onStop和onStart上只需致电

@Override
public void onStart(){
    super.onStart();
    AppService service = AppService.getInstance();
    PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean("isRunning",true).commit();
}

@Override
public void onStop(){
    super.onStop();
    AppService service = AppService.getInstance();   
    PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean("isRunning",false).commit();
    service.startUserActivity();
    finish();
}

我希望这可以帮助你:)