2

以下に示すように、サービスを作成しました。サービスは、時刻を表示するテキスト ビューを含むシステム オーバーレイを作成します。Service クラスのパブリック メソッドを呼び出して、textView を現在の時刻で更新するインライン タイマー クラスがあります。メソッドを起動し、メソッドに配置したログを介して新しい時刻を渡すことはわかっていますが、それだけです。初めてテキストビューのテキストを変更するようです。これは、再描画されていないサーフェスオーバーレイに関係していると思います..誰かがこれを修正する方法、またはそれが可能かどうかについてのアイデアを持っています:

public class cusNavOverrideService extends Service {

Timer timer;
WindowManager.LayoutParams handleParams;
WindowManager.LayoutParams clockParams;
View screenBlock;
View disableStatusBar;
WindowManager winMgr;
TextView clock;

@Override
public void onCreate() {

    winMgr = (WindowManager)getSystemService(WINDOW_SERVICE); 
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    disableStatusBar = new TableLayout(getApplicationContext());


     handleParams =  new WindowManager.LayoutParams(
             WindowManager.LayoutParams.FILL_PARENT,
             50,
             WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
             WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
             WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH |
             WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
             WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
             PixelFormat.TRANSPARENT);



     handleParams.gravity = Gravity.TOP;
     handleParams.y = 752;

     clockParams = new WindowManager.LayoutParams(
             WindowManager.LayoutParams.FILL_PARENT,
             50,
             WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
             WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
             WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH |
             WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
             WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
             PixelFormat.TRANSPARENT);


     clockParams.y = 752;

    disableStatusBar.setBackgroundResource(R.drawable.cust_bar);

     winMgr.addView(disableStatusBar, handleParams);


     Typeface tf = Typeface.createFromAsset(getApplicationContext().getAssets(), "fonts/Futura Bold.otf");
     clock = new TextView(getApplicationContext());
     clock.setTextColor(Color.BLACK);
     clock.setTextSize(30.0f);
     clock.setWidth(50);
     clock.setTypeface(tf);
     clock.setGravity(Gravity.TOP);
     clock.setGravity(Gravity.RIGHT);
     clock.setPadding(0, 5, 50, 0);


     winMgr.addView(clock, clockParams);


     timer = new Timer();
     uiCheckTask tTask = new uiCheckTask();
     tTask.setService(this);
     timer.schedule(tTask, 100, 200);

     return START_REDELIVER_INTENT;
}
public void updateClock(String newTime){

    Log.v("updateClock", "(((((((((((((((((((("+newTime+")))))))))))))))))");
    clock.setText(newTime);



}
@Override
public IBinder onBind(Intent intent) {
    // We don't provide binding, so return null
    return null;
}

@Override
public void onDestroy() {
    timer.cancel();
    winMgr.removeView(disableStatusBar);
  //Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show(); 
}


class uiCheckTask extends TimerTask {

    cusNavOverrideService myService;
    String newTime;
    String tempTime;
    Time cTime; 
    String displayTime;

   public void setService(cusNavOverrideService service){
       myService = service;
       cTime= new Time(Time.getCurrentTimezone());
   }


    public void run() {


        try {

            cTime.setToNow();
            displayTime = cTime.format("%I:%M%P");

            if(displayTime.startsWith("0")){
               //displayTime ="CHUCK";
                newTime = displayTime.substring(1);
            }else{
                newTime = displayTime;
            }
            myService.updateClock(newTime);
        }
        catch(Exception ex)
        {
            Log.v("WINDOW CHANGE", "exemption:"+ex);
        }

    }

}

}

4

3 に答える 3

1

タイマーは独自のスレッドで実行され、UIスレッドのみが表示されているものを更新できます。

于 2012-11-07T15:48:13.057 に答える
0

私が使用した解決策は、timerTask の代わりにハンドラーを作成することでした

于 2012-11-07T16:12:16.767 に答える
0

ビューが消えたり再表示されたりしないという同じ問題があります。あなた (私たち) が WindowManager.addView(...) を使用してビューを追加したという事実で何かをしなければなりません。すべてが機能していますが、更新されていません。もしかして無効化?

于 2014-07-12T14:56:06.227 に答える