日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android remoteviews 设置背景,Android通过RemoteViews实现跨进程更新UI示例

發(fā)布時間:2025/3/21 Android 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android remoteviews 设置背景,Android通过RemoteViews实现跨进程更新UI示例 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、概述

前面一篇文章Android通過AIDL實現(xiàn)跨進程更新UI我們學習了aidl跨進程更新ui,這種傳統(tǒng)方式實現(xiàn)跨進程更新UI是可行的,但有以下弊端:

View中的方法數(shù)比較多,在IPC中需要增加對應的方法比較繁瑣。

View的每一個方法都會涉及到IPC操作,多次IPC帶來的開銷問題不容小覷。

View中方法的某些參數(shù)可能不支持IPC傳輸。例如:OnClickListener,它僅僅是個接口沒有序列化。

接下來我們通過RemoteViews實現(xiàn)跨進程更新UI

二、實現(xiàn)效果圖

在同一個應用中有兩個Activity,MainActivity和Temp2Activity,這兩個Activity不在同一個進程中。

現(xiàn)在需要通過Temp2Activity來改變MainActivity中的視圖,即在MainActivity中添加兩個Button,也就是實現(xiàn)跨進程更新UI這么一個功能。

在MainActivity里點擊“跳轉(zhuǎn)到新進程ACTIVITY”按鈕,會啟動一個新進程的Temp2Activity,我們先點擊“綁定服務”,這樣我們就啟動了服務,再點擊“AIDL更新”按鈕,通過調(diào)用handler來實現(xiàn)跨進程更新UI,點擊返回,我們發(fā)現(xiàn)MainActivity頁面中新添加了兩個按鈕,并且按鈕還具有點擊事件。

三、核心代碼

IremoteViewsManager.aidl

里面提供了兩個方法,一個是根據(jù)id更新TextView里面的內(nèi)容,一個是根據(jù)id添加view視圖

// IremoteViewsManager.aidl.aidl

package com.czhappy.remoteviewdemo;

interface IremoteViewsManager {

void addRemoteView(in RemoteViews remoteViews);

}

RemoteViewsAIDLService.Java

package com.czhappy.remoteviewdemo.service;

import android.app.Service;

import android.content.Intent;

import android.os.Binder;

import android.os.Bundle;

import android.os.IBinder;

import android.os.Message;

import android.os.RemoteException;

import android.widget.RemoteViews;

import com.czhappy.remoteviewdemo.IremoteViewsManager;

import com.czhappy.remoteviewdemo.activity.MainActivity;

/**

* Description:

* User: chenzheng

* Date: 2017/2/10 0010

* Time: 10:56

*/

public class RemoteViewsAIDLService extends Service {

private static final String TAG = "RemoteViewsAIDLService";

private Binder remoteViewsBinder = new IremoteViewsManager.Stub(){

@Override

public void addRemoteView(RemoteViews remoteViews) throws RemoteException {

Message message = new Message();

message.what = 1;

Bundle bundle = new Bundle();

bundle.putParcelable("remoteViews",remoteViews);

message.setData(bundle);

new MainActivity.MyHandler(RemoteViewsAIDLService.this,getMainLooper()).sendMessage(message);

}

};

public RemoteViewsAIDLService() {

}

@Override

public IBinder onBind(Intent intent) {

return remoteViewsBinder;

}

}

MainActivity.java

package com.czhappy.remoteviewdemo.activity;

import android.content.Context;

import android.content.Intent;

import android.os.Bundle;

import android.os.Handler;

import android.os.Looper;

import android.os.Message;

import android.support.v7.app.AppCompatActivity;

import android.util.Log;

import android.view.LayoutInflater;

import android.view.View;

import android.widget.LinearLayout;

import android.widget.RemoteViews;

import android.widget.TextView;

import com.czhappy.remoteviewdemo.R;

import java.lang.ref.WeakReference;

public class MainActivity extends AppCompatActivity {

private static String TAG = "MainActivity";

private static LinearLayout mLinearLayout;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mLinearLayout = (LinearLayout) this.findViewById(R.id.mylayout);

}

public static class MyHandler extends Handler {

WeakReference weakReference;

public MyHandler(Context context, Looper looper) {

super(looper);

weakReference = new WeakReference<>(context);

}

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

Log.i(TAG, "handleMessage");

switch (msg.what) {

case 1: //RemoteViews的AIDL實現(xiàn)

RemoteViews remoteViews = msg.getData().getParcelable("remoteViews");

if (remoteViews != null) {

Log.i(TAG, "updateUI");

View view = remoteViews.apply(weakReference.get(), mLinearLayout);

mLinearLayout.addView(view);

}

break;

default:

break;

}

}

};

public void readyGo(View view){

Intent intent = new Intent(MainActivity.this, Temp2Activity.class);

startActivity(intent);

}

}

Temp2Activity.java

package com.czhappy.remoteviewdemo.activity;

import android.app.PendingIntent;

import android.content.ComponentName;

import android.content.Context;

import android.content.Intent;

import android.content.ServiceConnection;

import android.os.Bundle;

import android.os.IBinder;

import android.os.RemoteException;

import android.support.annotation.Nullable;

import android.support.v7.app.AppCompatActivity;

import android.util.Log;

import android.view.View;

import android.widget.RemoteViews;

import com.czhappy.remoteviewdemo.IremoteViewsManager;

import com.czhappy.remoteviewdemo.R;

import com.czhappy.remoteviewdemo.service.RemoteViewsAIDLService;

/**

* Description:

* User: chenzheng

* Date: 2017/2/9 0009

* Time: 16:05

*/

public class Temp2Activity extends AppCompatActivity {

private String TAG = "Temp2Activity";

private IremoteViewsManager remoteViewsManager;

private boolean isBind = false;

private ServiceConnection remoteViewServiceConnection = new ServiceConnection() {

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

Log.i(TAG,"onServiceConnected");

remoteViewsManager = IremoteViewsManager.Stub.asInterface(service);

}

@Override

public void onServiceDisconnected(ComponentName name) {

//回收

remoteViewsManager = null;

}

};

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

this.setContentView(R.layout.activity_temp);

}

/**

* 綁定服務

*/

public void bindService(View view) {

Intent viewServiceIntent = new Intent(this,RemoteViewsAIDLService.class);

isBind = bindService(viewServiceIntent,remoteViewServiceConnection, Context.BIND_AUTO_CREATE);

}

/**

* 更新UI

*/

public void UpdateUI(View view){

RemoteViews remoteViews = new RemoteViews(Temp2Activity.this.getPackageName(),R.layout.button_layout);

Intent intentClick = new Intent(Temp2Activity.this,FirstActivity.class);

PendingIntent openFirstActivity = PendingIntent.getActivity(Temp2Activity.this,0,intentClick,0);

remoteViews.setOnClickPendingIntent(R.id.firstButton,openFirstActivity);

Intent secondClick = new Intent(Temp2Activity.this,SecondActivity.class);

PendingIntent openSecondActivity = PendingIntent.getActivity(Temp2Activity.this,0,secondClick,0);

remoteViews.setOnClickPendingIntent(R.id.secondButton,openSecondActivity);

remoteViews.setCharSequence(R.id.secondButton,"setText","想改就改");

try {

remoteViewsManager.addRemoteView(remoteViews);

} catch (RemoteException e) {

e.printStackTrace();

}

}

@Override

protected void onDestroy() {

super.onDestroy();

if(isBind){

unbindService(remoteViewServiceConnection);

isBind = false;

}

}

}

AndroidManifest.xml

package="com.czhappy.remoteviewdemo">

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:supportsRtl="true"

android:theme="@style/AppTheme">

android:name=".activity.Temp2Activity"

android:process=":remote2" />

四、總結

RemoteViews就是為跨進程更新UI而生的,內(nèi)部封裝了很多方法用來實現(xiàn)跨進程更新UI。但這并不代表RemoteViews是就是萬能的了,它也有不足之處,目前支持的布局和View有限

layout:

FrameLayout LinearLayout RelativeLayout GridLayout

View:

AnalogClock button Chronometer ImageButton ImageView ProgressBar TextView ViewFlipper ListView GridView StackView AdapterViewFlipper ViewStub

不支持自定義View 所以具體使用RemoteViews還是aidl或者BroadCastReceiver還得看實際的需求。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

總結

以上是生活随笔為你收集整理的android remoteviews 设置背景,Android通过RemoteViews实现跨进程更新UI示例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。