首页 > 解决方案 > startActivity() 在 Runnable 接口中不起作用

问题描述

我的项目中有一个服务类(SaveMyAppsService.java),一旦启动,它将检查前台应用程序,如果当前前台应用程序的包名称与List<String> lockedApps包含锁定应用程序包名称的匹配,它应该启动另一个活动CustomPinActivity,但它不工作!

PS:我可以mytag在 Logcat 中看到日志。

ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();

scheduler.scheduleAtFixedRate(new Runnable() {
    @Override
    public void run() {
        lockedApps = AppPref.getInstance().getAppList(getApplicationContext());

            String localPackName = checkRunningApps(); //returns package name of the current foreground app.

            if( lockedApps.contains(localPackName) ){
                Log.i("mytag","yes this is in lockedApps pref");

                if( !allowedApps.contains( localPackName )){
                    Log.i("mytag","It was not allowed!!!!!!!!!!!!!!!!!!!!!!!!! but now it is");
                    allowedApps.add( localPackName );
                    previousAppName = localPackName;
                    Intent intent  = new Intent(SaveMyAppsService.this.getApplicationContext(), CustomPinActivity.class);
                    intent.putExtra(AppLock.EXTRA_TYPE, AppLock.UNLOCK_PIN);
                    intent.putExtra("package",checkRunningApps());
                    startActivity( intent );
                    checkAllowed();
                }
            }
    }
}, 0, 300, TimeUnit.MILLISECONDS);

标签: javaandroidrunnable

解决方案


我认为你应该像这样使用 Handler :

    private final Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        Bundle bundle = msg.getData();
        String localPackName = bundle.getString(AppLock.EXTRA_TYPE);
        Intent intent  = new Intent(SaveMyAppsService.this.getApplicationContext(), CustomPinActivity.class);
        intent.putExtra(AppLock.EXTRA_TYPE, AppLock.UNLOCK_PIN);
        intent.putExtra("package",localPackName);
        startActivity( intent );
        checkAllowed();
    }
};

并且您的代码已更新:

ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();

scheduler.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
    lockedApps = AppPref.getInstance().getAppList(getApplicationContext());

        String localPackName = checkRunningApps(); //returns package name of the current foreground app.

        if( lockedApps.contains(localPackName) ){
            Log.i("mytag","yes this is in lockedApps pref");

            if( !allowedApps.contains( localPackName )){
                Log.i("mytag","It was not allowed!!!!!!!!!!!!!!!!!!!!!!!!! but now it is");
                allowedApps.add( localPackName );
                previousAppName = localPackName;
                Message msg = mHandler.obtainMessage();
                Bundle bundle = new Bundle();
                bundle.putString(AppLock.EXTRA_TYPE, localPackName);
                msg.setData(bundle);
                mHandler.sendMessage(msg);
            }
        }
}
}, 0, 300, TimeUnit.MILLISECONDS);

推荐阅读