#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))
@ChristianBoler2. Возможно, стоит опубликовать ваш AndroidManifest.xml , если возможно. Также проверьте номера строк, указанные в ошибке.
3. строка ошибки находится в моем пользовательском сервисе, WmNewViewService.java , createWindowManagerView() :
mWindowManager.addView(myView, mParams);