繁体   English   中英

无法使用Intent启动服务,无法添加窗口-令牌null无效,您的活动是否正在运行?

[英]Unable to start service with Intent, Unable to add window — token null is not valid, is your activity running?

我是Android新手,出现此错误:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.wmaddviewtest, PID: 6104
java.lang.RuntimeException: Unable to start service com.example.wmaddviewtest.WmNewViewService@345022b with Intent { cmp=com.example.wmaddviewtest/.WmNewViewService }: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?<br/>
    ...... <br/>
 *Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
    at android.view.ViewRootImpl.setView(ViewRootImpl.java:774)*
    at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:373)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
    at com.example.wma<ddviewtest.WmNewViewService.createWindowManagerView(WmNewViewService.java:64)
    at com.example.wmaddviewtest.WmNewViewService.onStartCommand(WmNewViewService.java:31)

我确实在AndroidManifest.xml中添加了用户权限。 我的AndroidManifest如下:

    <?xml version="1.0" encoding="UTF-8"?>

-<manifest tools:ignore="GoogleAppIndexingWarning" package="com.example.wmaddviewtest" xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android">


-<application android:fullBackupContent="@xml/backup_descriptor" android:theme="@style/AppTheme" android:supportsRtl="true" android:roundIcon="@mipmap/ic_launcher_round" android:label="@string/app_name" android:icon="@mipmap/ic_launcher" android:allowBackup="true">

<service android:permission="" android:exported="true" android:enabled="true" android:name="com.example.wmaddviewtest.WmNewViewService"/>


-<activity android:name=".MainActivity">


-<intent-filter>

<action android:name="android.intent.action.MAIN"/>

<category android:name="android.intent.category.LAUNCHER"/>

</intent-filter>

</activity>

</application>

<uses-permission tools:ignore="ManifestOrder" android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

</manifest>

在MainActivity.java中:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    showViewBtn = findViewById(R.id.showViewBtn);
    showViewBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent();
            intent.setClass(MainActivity.this, WmNewViewService.class);
            startService(intent);
        }
    });
}

我添加了一个名为WmNewViewService.java的自定义服务,以下是其代码:

private MyView myView;
private WindowManager mWindowManager;
private WindowManager.LayoutParams mParams;
private final static String TAG = "WmNewViewService";
    public WmNewViewService() {
    }

    @Override
    public void onCreate() {
        super.onCreate();
        myView = new MyView(this);
        mWindowManager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        createWindowManagerView();
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (myView != null) {
            mWindowManager.removeViewImmediate(myView);
            myView = null;
        }
    }

    /**
     * set Parameters ,and AddView
     */
    public void createWindowManagerView() {
        mParams = new WindowManager.LayoutParams();
        mParams.width = mWindowManager.getDefaultDisplay().getWidth();
        mParams.height = mWindowManager.getDefaultDisplay().getHeight();
        mParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_PANEL;
        mParams.format = PixelFormat.RGBX_8888;
        mParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
        mParams.x = 0;
        mParams.y = 0;
        myView.requestLayout();
        mWindowManager.addView(myView, mParams);
    }

另外,您可以看到我新建了MyView,而MyView.java是:

private View myView;
private Button newViewBtn;

public MyView(Context context) {
    super(context);
    init();
}

public MyView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init();
}

private void init() {
    myView = LayoutInflater.from(getContext()).inflate(R.layout.myview, null, false);
    newViewBtn = myView.findViewById(R.id.newViewBtn);
}

另外,我新建了一个myview.xml,myview.xml只是一个LinearLayout,包含一个Button,Button的文字是“这是一个视图”。

在我的activity_main.xml中,我仅设置了一个可单击的按钮。

我只想单击我在activity_main.xml中的按钮,然后启动服务,然后服务使该按钮显示文本“这是一个视图”。

我确实尝试延迟。

尝试在AndroidManifest.xml中指定完整的程序包位置,看看是否有帮助。 IE:

<service android:enabled="true" android:name="com.exercise.AndroidClient.services.WmNewViewService" />

代替

<service android:enabled="true" android:name=".services.WmNewViewService" />

(显然用正确的包装位置代替)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM