Notification使用RemoteView后点击通知自动隐藏展开的通知栏

当Notification使用RemoteView之后,用户点击Notification后系统不会自动隐藏展开的通知栏.这个时候需要通过Java的反射特性使用StatusBarManager类中被隐藏的方法collapse来手动隐藏通知栏.
首先需要获取权限:

1
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />

然后通过反射的方法调用collapse收起展开的通知栏:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private void collapseStatusBar(Context context) {
    try {
        Object service = context.getSystemService("statusbar");
        Class<?> statusBarManager = Class.forName("android.app.StatusBarManager");
        Method collapse;
        if (service != null) {
            if (Build.VERSION.SDK_INT <= 16) {
                collapse = statusBarManager.getMethod("collapse");
            } else {
                // api17开始这个方法的名字变了
                collapse = statusBarManager.getMethod("collapsePanels");
            }
            collapse.setAccessible(true);
            collapse.invoke(service);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

点击Notice时调用这个方法就可以让展开的通知栏自动收起了.

Service中使用全局Dialog

Service中默认情况下是没法使用Dialog的. 但可以通过申请权限的方式让Service也可以使用Dialog.
首先在AndroidManifest.xml中声明权限:

1
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

然后在Service中创建Dialog并且将Dialog的Windows Type设定为WindowManager.LayoutParams.TYPE_SYSTEM_ALERT即可:

1
2
3
4
5
6
7
8
9
10
class TestService extends Service {
// ...省略无关代码
 
private void showDialog() {
    Dialog dialog = new Dialog(this);    // 其他Dialog也一样, 因为都是从Dialog类派生出来的
    dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
    dialog.setMessage("在Service中使用全局Dialog");
    dialog.show();
}
}

在Service中使用Toast

Android中Service没法直接使用Toast显示一个提示, 通过以下的方法可以在Service中全局使用Toast显示提示.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class TestService extends Service {
//... 省略无关代码
 
private Handler toastHandler = new Handler();
private Runnable toastRunnable = new Runnable() {
    @Override
    public void run() {
        Toast.makeText(TestService.this, "在Service中使用Toast显示提示.", Toast.LENGTH_SHORT).show();
    }
}
 
@Override
public void onCreate() {
    super.onCreate();
 
    // 调用显示Toast
    toastHandler.post(toastRunnable);
}
}