我有一项活动申请
我希望它始终打开,所以当它停止时,30秒后应用程序再次打开。
这是我的代码:
:
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。
答案 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();
}
我希望这可以帮助你:)