サービス初級:Activityとサービス間の連絡、サービス接続の書き換え

4639 ワード

MainActivity:
public class MainActivity extends Activity
{
    Mybinder mybinder =null;
    ServiceConnection mConn = new ServiceConnection()
    {
        @Override
        public void onServiceDisconnected(ComponentName name)
        {
                        
        }
                    
        @Override
        public void onServiceConnected(ComponentName name, IBinder binder)
        {
            mybinder = (Mybinder) binder;// binder, Mybinder 
            Log.e("MainActivity", "mybinder.getname()");
        }
    };
                
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
                    
        final TextView textView1 = (TextView) findViewById(R.id.textView1);
        final TextView textView2 = (TextView) findViewById(R.id.textView2);
                    
                    
        findViewById(R.id.button1).setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Intent intent = new Intent(MainActivity.this,MyService.class);
                            
                bindService(intent, mConn, BIND_AUTO_CREATE);
            }
        });
                    
        findViewById(R.id.button2).setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                unbindService(mConn);
            }
        });
                    
        findViewById(R.id.button3).setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                textView1.setText(mybinder.play());// mybinder service , service
            }
        });
                    
        findViewById(R.id.button4).setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                textView2.setText(mybinder.pause());
            }
        });
    }
                
    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
                
}

MyService:
public class MyService extends Service
{
    public String play()
    {
        return " ";
    }
    public String pause()
    {
        return " ";
    }
      
    class Mybinder extends Binder//Binder IBinder,Mybinder Binder 
    {
        // Mybinder 
        public String getname()
        {
            return "myBinder";
        }
          
        // 
        public String play()
        {
            return MyService.this.play();
        }
        public String pause()
        {
            return MyService.this.pause();
        }
    }
      
    private IBinder binder = new Mybinder();//IBinder Mybinder 
      
    @Override
    public IBinder onBind(Intent intent)
    {
        Log.e("MyService", "onBind");
        return binder;// IBinder 
    }
      
    @Override
    public void onCreate()
    {
        Log.e("MyService", "onBind");
        super.onCreate();
    }
      
    @Override
    public boolean onUnbind(Intent intent)
    {
        Log.e("MyService", "onUnbind");
        return super.onUnbind(intent);
    }
      
    @Override
    public void onDestroy()
    {
        Log.e("MyService", "onDestroy");
        super.onDestroy();
    }
      
}

注意:
  • サービス属性
  • android:enabled
    このプロパティは、サービスがインスタンス化できるかどうかを示すために使用されます.trueに設定すると、インスタンス化できます.そうしないと、インスタンス化できません.デフォルトはtrueです.
    <アプリケーション>要素には独自のenabledプロパティがあり、サービスコンポーネントを含むアプリケーション内のすべてのコンポーネントに適用されます.有効なサービスの場合、<アプリケーション>要素と要素のenabledプロパティはtrue(デフォルトはtrue)でなければなりません.エレメントのenabledプロパティがfalseに設定されている場合、サービスはインスタンス化されずに無効になります.
    android:exported
    このプロパティは、サービスが他のアプリケーションコンポーネントによって呼び出されたり、インタラクティブになったりできるかどうかを示すために使用されます.trueに設定すると、呼び出されたりインタラクティブになったりできます.そうしないとできません.falseに設定すると、同じアプリケーションのコンポーネントまたは同じユーザーIDを持つアプリケーションのみがサービスを開始またはバインドできます.
    デフォルト値は、サービスに含まれるフィルタに依存します.フィルタがないと、サービスは明確なクラス名を指定することによってのみ呼び出されます.つまり、サービスはアプリケーションの内部でのみ使用できます(他の外部ユーザーはサービスのクラス名を知らないため).この場合、この属性のデフォルト値はfalseです.一方、少なくとも1つのフィルタが含まれている場合、サービスは外部の他のアプリケーションにサービスを提供できることを意味し、デフォルト値はtrueである.
    このプロパティは、サービスを他のアプリケーションに暴露することを制限する唯一の方法ではありません.また、権限を使用して、サービスと対話できる外部エンティティを制限することもできます.
    本文は“空は痕跡がありませんが私は飛んだことがあります”のブログから出て、転載して作者と連絡してください!