我是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" />
(显然替换正确的包装位置)