Не удается запустить службу с намерением, не удается добавить окно — значение нулевого токена недопустимо, выполняется ли ваше действие?

#java #android #service #view

#java #Android #Обслуживание #Вид

Вопрос:

Я новичок в 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 просто линейное описание, включает кнопку, текст кнопки — «это представление».

В моем activity_main.xml Я установил только кнопку, на которую можно нажимать.

Я просто хочу, когда я нажимаю кнопку, которая находится в activity_main.xml затем запустите службу, и служба отобразит кнопку с текстом «это представление».

Я пытаюсь выполнить postdelay.

Комментарии:

1. когда я вижу информацию об ошибке: «android.view.ViewRootImpl.setView(ViewRootImpl.java: 774)», я просто подумал, что MyView.getparent() равен нулю, но я не знаю, почему это неправильно.

2. Вы пытаетесь изменить представление в своем действии из службы? Если да, вам следует отправить широковещательную передачу из вашей службы в activity и в получателе изменить представление.

3. Я думаю, что я не пытаюсь изменить представление в моем действии из службы, я хочу показать новое представление (the myview.xml ) над представлением в моем действии, должен ли я также отправлять широковещательную рассылку?

4. тем временем я просмотрел некоторый код для отправки широковещательной рассылки и получателя, я пытаюсь использовать ‘sendBroadcast (намерение);’ вместо ‘startService (намерение)’ сейчас.

Ответ №1:

Попробуйте указать полное местоположение пакета в AndroidManifest.xml и посмотрим, поможет ли это. IE:

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

вместо

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

(очевидно, замена на правильное расположение пакета)

Комментарии:

1. спасибо за ваш ответ, я заменил правильное расположение пакета, но все та же ошибка, сказал, что 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)) @ChristianBoler

2. Возможно, стоит опубликовать ваш AndroidManifest.xml , если возможно. Также проверьте номера строк, указанные в ошибке.

3. строка ошибки находится в моем пользовательском сервисе, WmNewViewService.java , createWindowManagerView() : mWindowManager.addView(myView, mParams);