广告系统4.0移植说明

广告系统4.0也就是SystemAdvert.apk,主要包括待机广告、待机唤醒广告(播放的是开机广告)、无信号屏保广告、无操作屏保广告。待机唤醒广告功能的实现不需要系统移植相关代码,所以这里只介绍待机广告、无信号屏保、无操作屏保的移植。

待机广告移植说明

目前的平台中按照是否有STR可以分为两种,保留STR的平台(例如638、V500平台),去掉STR的平台(例如648)。保留STR的平台中又可以分为638和V500两种移植形式,所以目前主要存在三种形式的待机广告移植形式,只是大同小异罢了。
主要区别:
待机广告Activity的启动参数不一样

保留STR

以V500、638为代表,但是V500与638又有一些区别。
V500由于不支持待机唤醒直接播放视频广告,所以待机广告和待机唤醒广告的实现在两个Activity中。而638平台的待机广告和待机唤醒广告是在一个Activity中实现的,所以两个平台的移植有一些不同。

V500移植说明

  • 修改文件
    PhoneWindowManager.java
  • 修改内容
    修改倒计时
static final int STANDBY_LOGO_WAIT_TIME_OUT = 7* 1000;

启动待机广告Activity

final Runnable rStandbyDialogConfirmCallback = new Runnable() {
        @Override public void run() {
            Log.d(TAG, "standbyDialog, in confirm callback -- modify by liupeng");
            /*if (null == standbyHintDialog) {
                standbyHintDialog = StandbyHintDialog.create(mContext, mHandler);
            }*/
            //add for SystemAdvert begin
            Log.d(TAG, "standby logo shown = " + System.currentTimeMillis());
            Log.d(TAG,"Start SystemStandbyActivity");
            if(checkApkExist(mContext,"com.konka.systemadvert")){
                Log.d(TAG,"com.konka.systemadvert is exist");
                try{
                    Intent intentSetup = new Intent();
                    intentSetup.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK,Intent.FLAG_ACTIVITY_CLEAR_TASK);
                    intentSetup.setClassName("com.konka.systemadvert", "com.konka.systemadvert.SystemStandbyActivity");
                    intentSetup.putExtra("standby",0);
                    Log.d(TAG,"Start com.konka.systemadvert.SystemStandbyActivity");
                    mContext.startActivity(intentSetup);
                }catch(ActivityNotFoundException e){                    
                    Log.d(TAG, "com.konka.systemadvert.SystemStandbyActivity can't find");
                }
            }
            else{
                Log.d(TAG,"com.konka.systemadvert is not exist");
            }
            //end for SystemAdvert end
            //屏蔽掉不用的代码
}

屏蔽按键

public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {
            ...
    //add for SystemAdvert begin
    if(bDiscardAllKeyInSystemAdvert()){
            Log.d(TAG, "SystemAdvert don't need this key, discard the key  ---- by Hfeng");
            return -1;
    }
    if(bDiscardSomeKeyInSystemAdvert()){
            if(keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_VOLUME_UP
                || keyCode == KeyEvent.KEYCODE_VOLUME_MUTE){
                Log.d(TAG, "SystemAdvert  need this key, release the key  ---- by Hfeng");
            }
            else {
                Log.d(TAG, "SystemAdvert  don't need this key, discard the key  ---- by Hfeng");
                return -1;
            }
    }
    //add for SystemAdvert end

  }
public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags, boolean isScreenOn) {
          ...
          case KeyEvent.KEYCODE_POWER: {
                 //add by SystemAdvert begin  
                if(bDiscardSomeKeyInSystemAdvert()){
                Log.d(TAG," Discard the key dispatching because SystemSTRBootActivity is running -- by Hfeng");
                break;
                //add by SystemAdvert end
          }
  }
//add for SystemAdvert begin
//新增方法,判断当前是否为待机广告Activity
public boolean bDiscardAllKeyInSystemAdvert(){
        boolean bSystemAdvert = false;
        ActivityManager am = (ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE);
        ComponentName cn = am.getRunningTasks(2).get(0).topActivity;
        String packageName = cn.getPackageName();
        String className = cn.getClassName();
        Log.d(TAG, "The package of top task is ========= " + packageName);
        Log.d(TAG, "The package of classname is ========= " +className);
        if(packageName.equals("com.konka.systemadvert") && className.equals("com.konka.systemadvert.SystemStandbyActivity")){
            bSystemAdvert = true;
        }
        if(bSystemAdvert){
            return true;
        } else {
            return false;
        }       
  }
//add for SystemAdvert end
//add for SystemAdvert begin
//新增方法,判断当前是否为待机唤醒Activity
public boolean bDiscardSomeKeyInSystemAdvert(){
        boolean bSystemAdvert = false;
        ActivityManager am = (ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE);
        ComponentName cn = am.getRunningTasks(2).get(0).topActivity;
        String packageName = cn.getPackageName();
        String className = cn.getClassName();
        Log.d(TAG, "The package of top task is ========= " + packageName);
        Log.d(TAG, "The package of classname is ========= " +className);
        if(packageName.equals("com.konka.systemadvert") && className.equals("com.konka.systemadvert.SystemSTRBootActivity")){
            bSystemAdvert = true;
        }
        if(bSystemAdvert){
            return true;
        } else {
            return false;
        }       
} 
//add for SystemAdvert end
//add for SystemAdvert begin
//新增方法,判断应用是否安装
public boolean checkApkExist(Context context, String packageName){
        if(packageName == null || "".equals(packageName)){
        Log.d(TAG,packageName+" is null");
            return false;
        }
        try{
            context.getPackageManager().getPackageInfo(packageName, 
                PackageManager.GET_UNINSTALLED_PACKAGES);
            return true;
        } catch(NameNotFoundException e){
        Log.d(TAG,packageName+" not find");
            return false;
        }
}
//add for SystemAdvert end

638移植说明

  • 修改文件
    PhoneWindowManager.java
  • 修改内容
    修改倒计时
static final int STANDBY_LOGO_WAIT_TIME_OUT = 10 * 1000;

启动待机广告Activity

final Runnable rStandbyDialogConfirmCallback = new Runnable() {
        @Override public void run() {
            Log.d(TAG, "standbyDialog, in confirm callback -- modify by liupeng");
            /*if (null == standbyHintDialog) {
                standbyHintDialog = StandbyHintDialog.create(mContext, mHandler);
            }*/
            Log.d(TAG, "standby logo shown = " + System.currentTimeMillis());
            //add for SystemAdvert begin
            Log.d(TAG,"Start SystemStandbyActivity");
            if(checkApkExist(mContext,"com.konka.systemadvert")){
                Log.d(TAG,"com.konka.systemadvert is exist");
                try{
                    //待机广告是否结束标记位置位
                    SystemProperties.set("sys.standbyAdFinished.advert", "false");
                    //是否是待机唤醒广告的标记位置位
                    SystemProperties.set("sys.playSTRBoot.advert", "false");
                    Intent intentSetup = new Intent();
                    intentSetup.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                    intentSetup.setClassName("com.konka.systemadvert", "com.konka.systemadvert.SystemStandbyActivity");
                    intentSetup.putExtra("standby",0);
                    //是否启动待机唤醒广告activity来播放待机开机广告
                    intentSetup.putExtra("startSTRBootActivity",false);
                    //是否由广告系统来播放开机图片广告
                    intentSetup.putExtra("playAdBootAnimation",false);
                    Log.d(TAG,"Start com.konka.systemadvert.SystemStandbyActivity");
                    mContext.startActivity(intentSetup);
                }catch(ActivityNotFoundException e){                    
                    Log.d(TAG, "com.konka.systemadvert.SystemStandbyActivity can't find");
                }
            }
            else{
                Log.d(TAG,"com.konka.systemadvert is not exist");
            }
            //屏蔽掉不用的代码
            //add for SystemAdvert end
  }

屏蔽按键

public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {
              ...
            //add for SystemAdvert begin
            if(bDiscardSomeKeyInSystemAdvert()){
                if(getPlaySTRBootSystemProperty()){
                  if(keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_VOLUME_UP
                    || keyCode == KeyEvent.KEYCODE_VOLUME_MUTE){
                        Log.d(TAG, "SystemAdvert STRBoot need this key, release the key  ---- by Hfeng");
                  }
                  else {
                        Log.d(TAG, "SystemAdvert  STRBoot don't need this key, discard the key  ---- by Hfeng");
                        return -1;
                  }
                }
                else {
                    Log.d(TAG, "SystemAdvert don't need this key, discard the key  ---- by Hfeng");
                    return -1;
                }
              }
          //add for SystemAdvert end

  }
public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags, boolean isScreenOn){
            ... 
            case KeyEvent.KEYCODE_POWER: {
                  //add for SystemAdvert begin
                  if(bDiscardSomeKeyInSystemAdvert() && getPlaySTRBootSystemProperty()){
                      Log.d(TAG," Discard the key dispatching because SystemStandbyBootActivity is running -- by Hfeng");
                      break;
                  }
                  //add for SystemAdvert end
                  if (down) {
                          ...
                  }
                  else{
                        ...
                        while (!isStandbyLogoFinish) {
                             try {
                                   TimeUnit.MILLISECONDS.sleep(200);
                             } catch (InterruptedException e) {
                                   e.printStackTrace();
                             }
                            //add for SystemAdvert begin
                            if (SystemProperties.getBoolean("sys.standbyAdFinished.advert",false)){
                                Log.d(TAG, "!!!!!!!!!! STADNBY Advert play finished !!!!!");
                                break;
                            }
                            //add for SystemAdvert end
                            ...
                         }
                  }
        }
  }
//add for SystemAdvert begin
//判断当前是否是待机广告activity
public boolean bDiscardSomeKeyInSystemAdvert(){
        boolean bSystemAdvert = false;
        ActivityManager am = (ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE);
        ComponentName cn = am.getRunningTasks(2).get(0).topActivity;
        String packageName = cn.getPackageName();
        String className = cn.getClassName();
        Log.d(TAG, "The package of top task is ========= " + packageName);
        Log.d(TAG, "The package of classname is ========= " +className);
        if(packageName.equals("com.konka.systemadvert") && className.equals("com.konka.systemadvert.SystemStandbyActivity")){
            bSystemAdvert = true;
        }
        if(bSystemAdvert){
            return true;
        } else {
            return false;
        }       
} 
//add for SystemAdvert end
//add for SystemAdvert begin
//判断应用是否安装
public boolean checkApkExist(Context context, String packageName){
        if(packageName == null || "".equals(packageName)){
        Log.d(TAG,packageName+" is null");
            return false;
        }
        try{
            context.getPackageManager().getPackageInfo(packageName, 
                PackageManager.GET_UNINSTALLED_PACKAGES);
            return true;
        } catch(NameNotFoundException e){
            Log.d(TAG,packageName+" not find");
            return false;
        }
}
//add for SystemAdvert end
//add for SystemAdvert begin
//判断当前是否是播放待机唤醒广告
public boolean getPlaySTRBootSystemProperty(){
      return SystemProperties.getBoolean("sys.playSTRBoot.advert",false);   
 }
//add for SystemAdvert end

去掉STR

以648为代表
648平台去掉了STR,待机唤醒走的是开机流程。

648移植说明

648移植参照638的移植说明,注意只有一处不同,就是在启动待机广告Activity处多添加一个启动参数。这个参数的作用是待机广告启动为透明背景,并且不切STORAGE信源。启动的完整代码如下,注意与638的不同处。

final Runnable rStandbyDialogConfirmCallback = new Runnable() {
        @Override public void run() {
            Log.d(TAG, "standbyDialog, in confirm callback -- modify by liupeng");
            /*if (null == standbyHintDialog) {
                standbyHintDialog = StandbyHintDialog.create(mContext, mHandler);
            }*/
            Log.d(TAG, "standby logo shown = " + System.currentTimeMillis());
            //add for SystemAdvert begin
            Log.d(TAG,"Start SystemStandbyActivity");
            if(checkApkExist(mContext,"com.konka.systemadvert")){
                Log.d(TAG,"com.konka.systemadvert is exist");
                try{
                    //待机广告是否结束标记位置位
                    SystemProperties.set("sys.standbyAdFinished.advert", "false");
                    //是否是待机唤醒广告的标记位置位
                    SystemProperties.set("sys.playSTRBoot.advert", "false");
                    Intent intentSetup = new Intent();
                    intentSetup.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                    intentSetup.setClassName("com.konka.systemadvert", "com.konka.systemadvert.SystemStandbyActivity");
                    intentSetup.putExtra("standby",0);
                    //是否启动待机唤醒广告activity来播放待机开机广告
                    intentSetup.putExtra("startSTRBootActivity",false);
                    //是否由广告系统来播放开机图片广告
                    intentSetup.putExtra("playAdBootAnimation",false);
                    //add for 648 begin
                    intentSetup.putExtra("setBlackTheme",false);
                    //add for 648 end
                    Log.d(TAG,"Start com.konka.systemadvert.SystemStandbyActivity");
                    mContext.startActivity(intentSetup);
                }catch(ActivityNotFoundException e){                    
                    Log.d(TAG, "com.konka.systemadvert.SystemStandbyActivity can't find");
                }
            }
            else{
                Log.d(TAG,"com.konka.systemadvert is not exist");
            }
            //屏蔽掉不用的代码
            //add for SystemAdvert end
  }

无信号屏保移植说明

由于无信号的广播是由TvSetting发送的,所以需要根据平台选择植入最新的Tvsetting4.apk或者Tvsetting2.apk。

无操作屏保移植说明

  • 修改文件
    Settings.java
  • 修改内容
/**
    * 广告系统4.0无操作待机时间 
    * @hide
 */
public static final String NO_OPERATION_TIMEOUT = "no_operation_timeout";
  • 修改文件
    PowerManagerService.java
  • 修改内容
private static final int MSG_NO_OPERATION_TIMEOUT = 5;
private long mNoOperationTimeout;//广告系统4.0添加,系统无操作超时时间
public void init(Context context, LightsService ls,ActivityManagerService am, BatteryService bs, IBatteryStats bss,IAppOpsService appOps, DisplayManagerService dm) {
        ...
//add for SystemAdvert begin  
         mNoOperationTimeout=Settings.System.getInt(context.getContentResolver(),Settings.System.NO_OPERATION_TIMEOUT, 60000); 
//add for SystemAdvert end
  }
public void handleMessage(Message msg) {
          switch (msg.what) {
                    //add for SystemAdvert begin
                    case MSG_NO_OPERATION_TIMEOUT:
                              handleNoOperationTimeout(); 
                              break;
                    //add for SystemAdvert end
                    ...
           }
}
private void updateUserActivitySummaryLocked(long now, int dirty) {
          ...
          //add for SystemAdvert begin
          if (SystemProperties.getInt("sys.boot_completed",0) == 1){
                long nextNoOperationTimeout = 0;
                nextNoOperationTimeout = mLastUserActivityTime + mNoOperationTimeout;
                Message msg = mHandler.obtainMessage(MSG_NO_OPERATION_TIMEOUT);
                msg.setAsynchronous(true);
                mHandler.removeMessages(MSG_NO_OPERATION_TIMEOUT);
                mHandler.sendMessageAtTime(msg, nextNoOperationTimeout);
            }
        //add for SystemAdvert end
}
//add for SystemAdvert begin
//新增方法
/**
 * 发送无操作广播,用于调起广告系统的无操作屏保 
 */
private void handleNoOperationTimeout() { 
        Intent noActionIntent = new Intent( "konka.action.NO_OPERATION_TIMEOUT");
                noActionIntent.setFlags(Intent.
                        FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
        mContext.sendBroadcast(noActionIntent );            
 }
//add for SystemAdvert end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,351评论 0 17
  • 怎么如此平静, 感觉像是走错了片场.为什么呢, 因为上下游工作在同一个线程呀骚年们! 这个时候上游每次调用emit...
    Young1657阅读 1,440评论 2 1
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • 最近面试聊到很多启动过程的事情: Android系统的启动过程中就已经解析了系统中安装应用的androidMani...
    乐之飞于阅读 1,239评论 0 1
  • 我们曾触摸不到的远方,是指间长久的凝握,空气也能结成冰,窒息。 我没有非去不可的地方,可没想到一切都早有安排。...
    橘子鲨鱼阅读 368评论 0 4