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

问题描述 投票:0回答:1

我是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中的按钮,然后启动服务时,服务就会生成“这是一个视图”文本的按钮。

我确实尝试过后期。

java android service view
1个回答
0
投票

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

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

代替

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

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

© www.soinside.com 2019 - 2024. All rights reserved.