サービスを開始するアクティビティから開始し、サービスが再びアクティビティを呼び出すまでアイドル状態になります。アクティビティは onPause(私は信じています) になり、BroadcastReceiver が呼び出しを開始するまで再開されません。私のサービスは WindowManager をシステム オーバーレイとして作成し、ユーザーがそれをトリガーすると、アクティビティを呼び出して、アクティビティにいくつかのものを含む新しいビューを作成させることになっています。すべてが滞りなく進み、エラーのポップアップは表示されず、すべてのログはコードがスムーズに実行されることを示していますが、作成されるはずの新しいビューは決して表示されません。興味深いことに、アプリをクリックしてもう一度起動すると、以前に必要だったビューがポップアップ表示されます。なぜ私が望むときにそれが起こらないのか興味がありますが、代わりに見えないままです。ビューを可視に設定しようとしましたが、BringToFront() を試してみましたが、アクティビティをスタックの一番上に持ってくる意図でいくつかのフラグを試してみましたが、どれも機能しませんでした。関連するコードは以下のとおりです。
私のアプリがユーザーにとって良いと思わない理由や、Android の基本的な「設計」に従っていないと思う理由について聞くためにここにいるわけではありません。この興味深いバグのデバッグを手伝ってほしいだけです。
主な活動
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(MainActivity.this, MyService.class);
startService(intent); //if i comment out these lines and add the call
initService(); //to figureOutParam below it works perfectly
sendUserHome(); //this one as well
figureOutParam("UPDATE",0); //this is the call that i use to get through to
//the method though right now neither param is important
}
public void figureOutParam(String param, int top){
if(param.equals("UPDATE")){
View myView = new View(this);
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
myView = inflater.inflate(R.layout.activity_main, null);
myView.setBackgroundColor(Color.BLUE);
myView.bringToFront();
setContentView(myView);
}
}
MyService (サービスへのコールバックに関する重要な部分のみ)
@Override
public void onCreate() {
super.onCreate();
WindowManager window = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
Display d = window.getDefaultDisplay();
int width=d.getWidth();
int height=d.getHeight();
height= (int)(height*.025);
params = new WindowManager.LayoutParams(WindowManager.LayoutParams.FILL_PARENT,height,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL|
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH |
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
params.gravity=Gravity.BOTTOM;
wm = (WindowManager) getSystemService(WINDOW_SERVICE);
}
public void updateView(String params){
Intent i = new Intent(MY_INTENT);
i.putExtra("y", this.y);
i.putExtra("param", params);
sendBroadcast(i);
}
マニフェスト