센서 리스너를 사용하는 애플리케이션이 있습니다. 기본적으로,이 같은과 주요 활동이 있습니다Android/Java 센서 hashCode() 별개의 액티비티/서비스에 다른 값 제공
MainActivity.java
public class MainActivity extends AppCompatActivity
{
(...)
@Override
protected void onCreate(Bundle savedInstanceState)
{
SensorManager mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Log.d(LOG_TAG, "Accelerometer hashCode MA: " + mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER).hashCode());
Log.d(LOG_TAG, "Accelerometer reference MA: " + Integer.toHexString(System.identityHashCode(mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER))));
}
}
을 그리고 서비스는이 같은 MainActivity에서 시작 :
startService(new Intent(MainActivity.this, SensorService.class));
내 서비스 클래스 is :
SensorService.java
public class SensorService extends Service implements SensorEventListener, GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener, LocationListener
{
private SensorManager mSensorManager;
(...)
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Log.d(LOG_TAG, "Accelerometer hashCode SS: " + mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER).hashCode());
Log.d(LOG_TAG, "Accelerometer reference SS: " + Integer.toHexString(System.identityHashCode(mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER))));
}
}
내 스마트 폰에 Lollipop이 있었을 때 hashCodes의 출력이 활동 및 서비스에서 모두 동일했습니다. 그러나 스마트 폰을 Marshmallow로 업데이트했는데 hashCode가 다릅니다. 상기 출력은 항상 이렇게 지금 :
가속도계 해시 코드 MA : 262,356,196
가속도계 기준 MA : fa33ce4
가속도계 해시 코드 SS : 26,510,821
가속도계 기준 SS : 19485e5
간단한 소프트웨어 업데이트로 인해 해시 코드가 다른 동작을하는 이유를 알 수 없으며 동일한 동작이 필요합니다. 나 좀 도와 줄 수있어?
- UPDATE -
나는이 원하는 이유는 무엇입니까?
내 MainActivity에서 나는 스마트 폰에있는 모든 센서를보기에 "인쇄 중"입니다. 다음과 같이 동적으로 수행됩니다.
TextView sensorLayout = new TextView(this);
sensorLayout.setText(sensor.getStringType());
sensorLayout.setId(sensor.hashCode());
sensorLayout.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
mainLayout.addView(sensorLayout);
그런 다음 SensorService는 수신기입니다. onSensorChanged()이 호출 될 때마다이 변경 사항의 주요 활동을 알리므로 새 값을 볼 수 있습니다.
두 개의 추가 기능 (센서의 hashCode에 새로운 값과 정수가있는 문자열)이 포함 된 인 텐트를 브로드 캐스팅하면됩니다. MainActivity는 변경해야 볼 수있는 알 필요가 있으며이 같은 수행됩니다
int hashCode = intent.getIntExtra(SensorService.EXTRA_SENSOR_HASHCODE, 0);
TextView sensorLayout = (TextView) mainLayout.findViewById(hashCode);
sensorLayout.setText(intent.getStringExtra(SensorService.EXTRA_SENSOR_INFO));
"나는 똑같은 행동이 필요합니다."- 왜? 동일한 유형의 센서 일지라도 2 + '센서'객체가 동일한 'hashCode()'값을 가질 것이라고 결코 생각하지 않습니다. – CommonsWare
내 머리 속에는 getDefaultSensor() *가 호출 될 때마다 동일한 센서 (내 코드에서 가속도계)에 대한 참조를 제공해야한다고 생각하는 것이 합리적이라고 생각합니다. 실제로 그것은 사탕점에서의 행동 인 것 같습니다. – tjiagoM
"내 머리 속에서는 getDefaultSensor()가 동일한 센서에 대한 참조를 제공해야한다고 생각하는 것이 합리적이라고 생각합니다."-이 동작을 암시하는 모든 문서를 알지 못합니다. AFAIK, 당신은 위험한 움직임이었던 구현의 부작용에 의존했고, 이제는 가격을 지불하고 있습니다. 그래서 다시 물어 보겠습니다. ** ** 왜 당신에게 "똑같은 행동을하기 위해 그들이 필요합니까?" ** 당신이이 부작용에 의존 한 이유를 설명하면 ** 아마도 우리는 당신을위한 대안을 제안 할 수 있습니다. – CommonsWare