Вверх ↑
Ответов: 163
Рейтинг: 33
#1: 2015-02-14 22:08:10 ЛС | профиль | цитата
Netspirit, sаmakacd, может возьмете на заметку. Я тут подумал, чтобы при использовании нескольких одинаковых (или разных) элементов, использующих какие-то однотипные переменные в коде, которые не меняются в процессе работы, бестолку плодятся копии этих переменных, содержащие одинаковые значения. Ну например, каким-нибудь элементам нужен ContentResolver. Ну и допустим мы будем получать его в onCreate при запуске программы. Если договориться о каком-то стандарте в названиях полей, то можно в функции Init всех элементов, которым нужен ContentResolver, разместить примерно такой код:
#hws
    old = block.select(BLK_METHODS)
      if(not block.intext('public ContentResolver common_content_resolver;'))
        addToImport('android.content.Context')
        addToImport('android.content.ContentResolver')
        println('public ContentResolver common_content_resolver;')
        block.select(BLK_ON_CREATE)
        println('common_content_resolver = getApplicationContext().getContentResolver();')
      end
    block.select(old)
И поле common_content_resolver появится в коде на выходе лишь один раз (как и код по его инициализации).

И еще одно предложение. В сервисе неплохо бы в event onStart вывести Action переданного при запуске Intent`a (а в идеале еще и сам Intent снизу. Просто общаться с сервисом безопаснее всего именно через startService. При других способах надо быть уверенным что сервис запущен, иначе - exception. Прикладываю модификацию hiChildService, в которой Action выведен:
#hws
include("general")

func SaveEnvironment()
  // --- Сохраняем окружение родительского контейнера
  old_local_vars = BLK_LOC_VAR
  old_local_methods = BLK_METHODS
  old_oncreate = BLK_ON_CREATE
  old_onstart = BLK_ON_START
  old_ondestroy = BLK_ON_DESTROY
  old_class_name = CURRENT_CLASS
  old_import = BLK_IMPORT
  old_classes = BLK_CLASSES

  old_parent_id = PARENT_ID
  old_finalize = ARR_FINALIZE
  // ---
end

func RestoreEnvironment()
  // --- Восстанавливаем окружение родительского контейнера
  BLK_LOC_VAR = old_local_vars
  BLK_METHODS = old_local_methods
  BLK_ON_CREATE = old_oncreate
  BLK_ON_START = old_onstart
  BLK_ON_DESTROY = old_ondestroy
  CURRENT_CLASS = old_class_name
  BLK_IMPORT = old_import
  BLK_CLASSES = old_classes

  PARENT_ID = old_parent_id

  cur_finalize = ARR_FINALIZE
  ARR_FINALIZE = old_finalize
  // ---
end

func SetEnvironment()
  // --- Создаем окружение текущего контейнера
  BLK_LOC_VAR = local_vars
  BLK_METHODS = local_methods
  BLK_ON_CREATE = cur_oncreate
  BLK_ON_START = cur_onstart
  BLK_ON_DESTROY = cur_ondestroy
  CURRENT_CLASS = cur_class_name
  BLK_IMPORT = cur_import
  BLK_CLASSES = cur_classes

  PARENT_ID = sys.curelement()
  ARR_FINALIZE = cur_finalize
  // ---
end

// ============================================ INIT ============================================== //

func Init()
  fvar(old, tmp, tmp2, this)
  var(local_vars, local_methods, cur_oncreate,
       cur_onstart, cur_ondata, cur_ondestroy, cur_manifest, 
       cur_import, cur_classes, cur_finalize)

  var(old_local_vars, old_local_methods, old_oncreate,
       old_onstart, old_ondestroy, old_class_name, old_import,
       old_classes, old_parent_id, old_finalize)
  var(cur_class_name, cur_parent_class_name)


  this = sys.curelement()
  sys.selectelement(cgt.el_get_parent_id())
  tmp = cur_class_name
  tmp2 = cur_parent_class_name
  sys.selectelement (this)
  cur_class_name = tmp
  cur_parent_class_name = tmp2


  // --- Подготавливаем окружение текущего контейнера
  local_vars = block.reggen()
  local_methods = block.reggen()
  cur_oncreate = block.reggen()
  cur_onstart = block.reggen()
  cur_ondata = block.reggen()
  cur_ondestroy = block.reggen()
  cur_import = block.reggen()
  cur_classes = block.reggen()

  cur_finalize &= ''

  old = block.cur()

  // --- Сохраняем окружение родительского контейнера
  SaveEnvironment()

  // --- Создаем окружение текущего контейнера
  SetEnvironment()


  block.select(BLK_IMPORT)
    println('package ', PACKAGE_NAME, ';')
    println('import android.app.Service;')
    println('import android.app.Service;')
    println('import android.content.Intent;')
    println('import android.os.IBinder;')
  block.select(old)


  sys.initall()

    // ======== Обработка событий ======== //

    if(linked(onCreate))
      tmp = block.reggen()
      block.select(tmp)
        event(onCreate)
      block.select(BLK_ON_CREATE)
      block.copyhere(tmp)
      block.delete(tmp)
    end


    if(linked(onStart))
      fvar(res)
      AddVar(serv_start_action, 'String')
      tmp = block.reggen()
      block.select(tmp)
        println ('if (',intent,' == null) ',serv_start_action,' = "";')
        println ('else {')
          block.inclvl()
            println (serv_start_action,' = ',intent,'.getAction();')
            println ('if (',serv_start_action,' == null) ',serv_start_action,' = "";')
          block.declvl()
        println ('}')    
        
        res = ToType(serv_start_action, 2)
        event(onStart, res)
      block.select(BLK_ON_START)
      block.copyhere(tmp)
      block.delete(tmp)
    end
    
    if(linked(onData))
      tmp = block.reggen()
      block.select(tmp)
        event(onData, toType(idata, 100))
      block.select(cur_ondata)
      block.copyhere(tmp)
      block.delete(tmp)
    end

    if(linked(onDestroy))
      tmp = block.reggen()
      block.select(tmp)
        event(onDestroy)
      block.select(BLK_ON_DESTROY)
      block.copyhere(tmp)
      block.delete(tmp)
    end

    // ======== ================= ======== //

  block.select(old)

  // --- Восстанавливаем окружение родительского контейнера
  RestoreEnvironment()

end

// ========================================================================================== //


func doStop(_data)
  println('stopSelf();')
end

func getData(d)
  if(array_count(d) == 2)
    return(d[1])  
  elseif(d != '')    
    return(d)
  else
    return('""')
  end
end

func doSendData(_data)
  println(mem,' = new Memory();')
  println(mem,'.setValue(',getData(_data),');')
  println(cur_parent_class_name,'.activity.on',cur_class_name,'Data(',mem,');')
  println('DataNotifier.notify("',cur_class_name,'", ',mem,');')
end

func doStartForeground(_data)
  fvar(n, i)
  
  if(ForegroundNotification != 0) 
    n = sys.event(ForegroundNotification, 'get_notification')
    i = sys.event(ForegroundNotification, 'get_id')
  
    println('startForeground(',i,', ',n,');')
  end
end

func doStopForeground(_data)
  if(ForegroundNotification != 0)  
    println('stopForeground(true);')
  end
end

// ============================================ FINISH ============================================== //
func Finish()
  fvar(old, tmp, i, this, class_body, cls_index)

  old = block.cur()

  // --- Сохраняем окружение родительского контейнера
  SaveEnvironment()

  // --- Создаем окружение текущего контейнера
  SetEnvironment()


  // ********** Вызов метода finish() зарегистрированных компонентов *********** //

    for (i = 1; i<_arr.count(ARR_FINALIZE); i++)
      sys.event(ARR_FINALIZE[i], 'finish')
    end

  // *************************************************************************** //


  // ******** Тело класса ******** //

  class_body = block.reggen()
  ARR_CLASSES &= "x"
  cls_index = _arr.count(ARR_CLASSES)-1
  ARR_CLASSES[cls_index] = cur_class_name & class_body

  block.select(class_body)

  block.copyhere(cur_import)
  block.delete(cur_import)

  println('public class ', cur_class_name, ' extends Service {')
    block.inclvl()

    println('public static ',cur_class_name,' service;') // Статическое поле для передачи данных
    println('public Memory ',mem,';')
    block.copyhere(local_vars)
    block.delete(local_vars)
    block.copyhere(local_methods)
    block.delete(local_methods)
    
    println('')
    println('@Override')
    println('public IBinder onBind(Intent ',arg,') {')
      block.inclvl()
        println('return null;')
      block.declvl()
    println('}')

  //== onCreate
    println('')
    println('@Override')
    println('public void onCreate() {')
      block.inclvl()
        println('super.onCreate();')
        block.copyhere(cur_oncreate)
        block.delete(cur_oncreate)
      block.declvl()
    println('}')
  // ==

  //== onStart
    println('@Override')
    println('public int onStartCommand(Intent ',intent,', int ',flags,', int ',startId,') {')
      block.inclvl()
        println('service = this;')
        block.copyhere(cur_onstart)
        block.delete(cur_onstart)
        println('return START_STICKY;')
      block.declvl()
    println('}')
  // ==
  
  //== onData
  println('public void onData(Memory ',idata,') {')
    block.inclvl()
      block.copyhere(cur_ondata)
      block.delete(cur_ondata)
    block.declvl()
  println('}')
  // ==

  //== onDestroy
    if (not block.isempty(cur_ondestroy))
      println('@Override')
      println('public void onDestroy() {')
        block.inclvl()
          block.copyhere(cur_ondestroy)
          block.delete(cur_ondestroy)
          println('super.onDestroy();')
        block.declvl()
      println('}')
    end
  // ==

  block.declvl()
  println('}') // Закрывающая скобка текущего класса

  // Дополнительные классы
  block.copyhere(cur_classes)
  block.delete(cur_classes)

// ******************************** //

// ******** MANIFEST ******** //

    block.select('BLK_MANIFEST')
    tmp = block.reggen()
    block.select(tmp)
      println('<service android:name=".',cur_class_name,'"></service>')
    block.select('BLK_MAINBODY')
    MFAddComponent(tmp)
    block.delete(tmp)

// ************************ //

  block.select(old)

  // --- Восстанавливаем окружение родительского контейнера
  RestoreEnvironment()

end

// ========================================================================================== //

Ну и на последок, я в своих элементах заметил несколько ошибок из-за невнимательности, так что скоро обновлю.
карма: 3

0